2016-07-04 33 views
6

UPDATEAndroid 6.0 - Bluetooth - Nessun codice esiste per Action_Found trasmesso intento

ho provato molti codici, anche da esempi mostrati su internet. ognuno di loro segue il mio approccio. Dopo molte ore di test, sono giunto alla conclusione che su Android 6.0 non c'è possibilità di ottenere la scoperta bluetooth di dispositivi sconosciuti, possiamo solo recuperare quelli legati. Sono abbastanza sicuro che ci sia qualcosa con questa versione di Android.

se qualcuno sa come risolvere questo problema, sarei davvero grato a qualsiasi aiuto.


originale Messaggio

Il mio codice sta lavorando bene, ma nessun dispositivo ottenere trovato. ricevo solo DISCOVERY_STARTED e DISCOVERY_FINISHED, quindi non vengono trovati dispositivi, ma tramite l'app di sistema questi dispositivi vengono rilevati.

Questo è il codice della mia applicazione, spero che possa essere d'aiuto.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bluetoothAdapter= BluetoothAdapter.getDefaultAdapter(); 

//other stuff... 

    IntentFilter filter=new IntentFilter(); 
    filter.addAction(BluetoothDevice.ACTION_FOUND); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 

    registerReceiver(myreceiver,filter); 
} 

final BroadcastReceiver myreceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 

     Log.i("test","RECEIVED: "+ action); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
     } 
     else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
     } 

     if(BluetoothDevice.ACTION_FOUND.equals(action)) 
     { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Log.i("test", device.getName() + "\n" + device.getAddress()); 
     } 
    }}; 

public void scanDevices(View v){ 

     if (bluetoothAdapter.isEnabled()){ 

      bluetoothAdapter.startDiscovery(); 
     } 
} 

ho già preso impostare le autorizzazioni:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+0

Possibile duplicato di questa domanda [qui] (http://stackoverflow.com/questions/32656510/register-broadcast-receiver-dynamically-does-not-work-bluetoothdevice-action-f) –

+0

@EdwardAlexander i don ' Penso di sì, ho letto quella domanda e il mio metodo onReceive viene chiamato correttamente. il problema è che non ricevo intenti ACTION_FOUND, solo DISCOVERY_STARTED e DISCOVERY_FINISHED. Nessun dispositivo viene trovato, ma usando l'applicazione di sistema posso recuperare l'elenco dei dispositivi disponibili. Perché? –

+1

Dovresti aver specificato chiaramente che stai usando Marshmallow, è tutta un'altra storia, qui controlla questo: [Bluetooth Discovery Marshmallow] (http://stackoverflow.com/questions/33052811/since-marshmallow-update-bluetooth-discovery -using-bluetoothadapter-getdefaultad) –

risposta

10

soluzione molto semplice:

1. Aggiungi autorizzazione FINE_LOCATION di manifestare:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

2. Richiesta FINE_LOCATION permesso a r untime:

//since i was working with appcompat, i used ActivityCompat method, but this method can be called easily from Activity subclassess. 
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSION_REQUEST_CONSTANT); 

3. Implementare onRequestPermissionsResult metodo:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 

switch (requestCode) { 
    case MY_PERMISSION_REQUEST_CONSTANT: { 
     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      //permission granted! 
     } 
     return; 
    } 
} 
} 

Tutto questo perché Marshmallows richiede questa autorizzazione, al fine di utilizzare la tecnologia Bluetooth per la scoperta.

Poiché questa autorizzazione appartiene al gruppo di autorizzazioni Dangerous, semplicemente dichiarandolo nel file manifest non funziona, è necessario il consenso esplicito dell'utente per utilizzare la posizione (anche se in realtà non abbiamo bisogno della posizione) .

+0

Molto utile, grazie! – Alison