12

Obiettivo: Creare un'app per Android che scopra i nomi e gli indirizzi dei dispositivi BT nel raggio di portata e invia i loro valori a un servizio web. I dispositivi BT non sono stati precedentemente collegati al dispositivo host, voglio solo interrogare tutto mentre cammino.Rilevazione dispositivo Bluetooth in Android - startDiscovery()

quello che ho fatto:

  1. studiato attentamente la documentazione.
  2. Implementata un'istanza locale dell'adattatore BT del dispositivo host.
  3. Implementata una notifica per abilitare BT se non è abilitata.
  4. Ricevitori e intenti di trasmissione registrati per analizzare lo ACTION_FOUNDs da startDiscovery().
  5. Registrato BLUETOOTH e BLUETOOTH_ADMIN autorizzazioni nel manifest.

Le cose funzionano (come testato con registrazione incrementale della console) fino a startDiscovery().


Frustrazione:

  • startDiscovery() - ho il sospetto sto passando questo nel contesto sbagliato. In quale contesto è necessario collocare questo metodo per funzionare correttamente?

Se sei riuscito a far funzionare questo metodo, apprezzerei molto la tua saggezza.

UPDATE - ecco una versione semplificata del codice che mi sta causando dolore; questa semplificazione riassume il mio errore. Questo codice funziona, non genera errori cat.log o altri errori, semplicemente non fornisce alcun output.

package aqu.bttest; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.widget.Toast; 

public class BT2Activity extends Activity { 

private BluetoothAdapter mBTA; 
private SingBroadcastReceiver mReceiver; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //register local BT adapter 
    mBTA = BluetoothAdapter.getDefaultAdapter(); 
    //check to see if there is BT on the Android device at all 
    if (mBTA == null){ 
     int duration = Toast.LENGTH_SHORT; 
     Toast.makeText(this, "No Bluetooth on this handset", duration).show(); 
    } 
    //let's make the user enable BT if it isn't already 
    if (!mBTA.isEnabled()){ 
     Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBT, 0xDEADBEEF); 
    } 
    //cancel any prior BT device discovery 
    if (mBTA.isDiscovering()){ 
     mBTA.cancelDiscovery(); 
    } 
    //re-start discovery 
    mBTA.startDiscovery(); 

    //let's make a broadcast receiver to register our things 
    mReceiver = new SingBroadcastReceiver(); 
    IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    this.registerReceiver(mReceiver, ifilter); 
} 

private class SingBroadcastReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); //may need to chain this to a recognizing function 
     if (BluetoothDevice.ACTION_FOUND.equals(action)){ 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      // Add the name and address to an array adapter to show in a Toast 
      String derp = device.getName() + " - " + device.getAddress(); 
      Toast.makeText(context, derp, Toast.LENGTH_LONG); 
     } 
    } 
} 

}

+0

Sarebbe utile sapere l'errore che si sta ottenendo ... o almeno che cosa sta portando esattamente a credere che 'startDiscovery()' funzioni in modo errato. –

risposta

15

Cosa contesto non questo metodo deve essere collocato all'interno di funzionare correttamente.

Per dirla semplicemente, si dovrebbe usare startDiscovery() quando si desidera che l'applicazione per rilevare i dispositivi Bluetooth locali ... per esempio, se si voleva implementare un ListActivity che esegue la scansione e aggiunge in modo dinamico i dispositivi Bluetooth nelle vicinanze ad un ListView (vedi DeviceListActivity).

L'utilizzo del metodo startDiscovery() dovrebbe essere simile a questo:

  1. Definire una variabile di classe che rappresenta l'adattatore Bluetooth locale.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
    
  2. Verificare se il dispositivo è già in fase di "rilevamento". Se lo è, quindi annullare la scoperta.

    if (mBtAdapter.isDiscovering()) { 
        mBtAdapter.cancelDiscovery(); 
    } 
    
  3. Subito dopo il controllo (e, eventualmente, annullando) la scoperta-mode, iniziare la scoperta chiamando,

    mBtAdapter.startDiscovery(); 
    
  4. Fare molta attenzione in generale accidentalmente lasciando il dispositivo in modalità di scoperta-. L'esecuzione del rilevamento dei dispositivi è una procedura pesante per l'adattatore Bluetooth e consuma molte delle sue risorse. Ad esempio, si desidera assicurarsi di controllare/annullare l'individuazione prima di tentare di stabilire una connessione. Molto probabilmente vuoi annullare la scoperta anche nel tuo metodo onDestroy.

fatemi sapere se questo ha aiutato ... e se si sta ancora problemi, aggiornare la vostra risposta con la vostra uscita logcat e/o eventuali messaggi di errore che si stanno ottenendo, e forse mi può aiutare a uscire un po ' Di Più.

+0

Questo ha aiutato. Anche il passaggio dei risultati a un ArrayAdapter invece che a un Toast ha sicuramente aiutato. – Lemminkainen

+0

c'è un modo per mantenere la scansione continua nel servizio BG senza inserire Timer ... qualsiasi API a livello di sistema. – CoDe

+0

@Shubh Io non la penso così. Il motivo per cui viene applicata questa restrizione è garantire che le applicazioni non abusino di "Bluetooth" eseguendo continuamente la scansione in background. –