2015-10-15 8 views
6

Ich habe auf Android 6 aktualisiert und meine Anwendungen, die Bluetooth verwenden, funktionieren nicht mit dieser neuen API-Version. Es ist das gleiche Problem mit der Anwendung im Play Store: Bluetooth spp tools pro (gute Anwendung, um zu sehen, ob Bluetooth funktioniert), die keine Geräte entdeckt.Android 6 Bluetooth

Das Problem scheint in Bluetooth Entdeckung zu sein:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
mBluetoothAdapter.startDiscovery() 
Log.i("BLUETOOTH", String.valueOf(mBluetoothAdapter.isDiscovering())); // Return false 

Meine Anwendungen arbeiten gut mit Android 5.4 und ich folgte: http://developer.android.com/guide/topics/connectivity/bluetooth.html

+0

auf welchem ​​Gerät tritt dieses Problem auf? Welcher Nexus? Ich mache auf Nexus 5 –

+0

Es ist auf einem Nexus 5 – eldina

Antwort

18

Staring mit Android 6.0 ist es kompilieren nicht genug, um Berechtigungen für das Manifest aufzunehmen. Sie müssen den Benutzer explizit nach jeder Berechtigung fragen, die als "gefährlich" betrachtet wird. BluetoothDevice.ACTION_FOUND erfordert BLUETOOTH und ACCESS_COARSE_LOCATION Berechtigungen http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND

Die ACCESS_COARSE_LOCATION http://developer.android.com/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION ist eine „gefährliche“ Erlaubnis und deshalb müssen Sie bitten, für sie requestPermission mit vor der eigentlichen Entdeckung zu tun.

public void doDiscovery() { 
    int hasPermission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION); 
    if (hasPermission == PackageManager.PERMISSION_GRANTED) { 
     continueDoDiscovery(); 
     return; 
    } 

    ActivityCompat.requestPermissions(MainActivity.this, 
      new String[]{ 
        android.Manifest.permission.ACCESS_COARSE_LOCATION}, 
      REQUEST_COARSE_LOCATION_PERMISSIONS); 
} 

dann auf Sie den Benutzer Antwort auf onRequestPermissionsResult bekommen

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_COARSE_LOCATION_PERMISSIONS: { 
      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       continueDoDiscovery(); 
      } else { 
       Toast.makeText(this, 
         getResources().getString(R.string.permission_failure), 
         Toast.LENGTH_LONG).show(); 
       cancelOperation(); 
      } 
      return; 
     } 
    } 
} 

mit früheren Versionen von Android zu arbeiten, sollten Sie Kompatibilitätsbibliotheken verwenden und die Anrufe tätigen ActivityCompat mit

+0

ist das für Bluetooth notwendig? oder nur für acess_coarse_location? –

+0

ja, für beide, nach Google-Dokumentation, https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND – Luci

3

ich einige Zeit damit verbracht haben, das Problem zu untersuchen.
Erstellt Fehlerbericht auf Android Bug Tracker here
Das Problem ist, dass das System BluetoothDevice.ACTION_FOUND Intents nicht an die registrierte BroadcastReceiver weiterleiten. Logcat zeigt Zeilen wie diese:

10-16 07:34:09.147  786-802/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } to ProcessRecord{5ce2d92 21736:com.example.mvl.bluetoothtest/u0a74} (pid=21736, uid=10074) requires android.permission.ACCESS_COARSE_LOCATION due to sender com.android.bluetooth (uid 1002)  

Welche Themen für mich, dass die Anwendung android.permission.ACCESS_COARSE_LOCATION die Berechtigung, diese Absichten empfangen muss. Ich persönlich verstehe nicht, warum ich diese Erlaubnis brauche, um die Bluetooth-Geräte zu bekommen.
Also, wenn Sie diese Berechtigung Sie Manifest hinzufügen, dann sollte es mit einer weiteren Voraussetzung arbeiten - Sie haben Ziel SDK zu setzen und mit SDK nicht höher, dann 22.

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

Die ACCESS_COARSE_LOCATION ist erforderlich, weil Bluetooth, wie Wi-Fi und Netzwerk (nicht GPS-Geräte, streng genommen) kann Ihnen auch helfen, Ihre Position mit der Verwendung von BT-Beacons Pin-Pin. Daher ist das Gewähren der Standortberechtigung ebenfalls vorab erforderlich. – dekaru

0

Wenn die Quelle überprüft Code in GattService.java, finden Sie einige Code Kommentare in Methode onScanResult:

// Do no report if location mode is OFF or the client has no location permission 
// PEERS_MAC_ADDRESS permission holders always get results 
if (hasScanResultPermission(client) && matchesFilters(client, result)) { 
    try { 
     ScanSettings settings = client.settings; 
     if ((settings.getCallbackType() & 
           ScanSettings.CALLBACK_TYPE_ALL_MATCHES) != 0) { 
      app.callback.onScanResult(result); 
     } 
    } catch (RemoteException e) { 
     Log.e(TAG, "Exception: " + e); 
     mClientMap.remove(client.clientIf); 
     mScanManager.stopScan(client); 
    } 
} 

Dies verdeutlicht, was benötigt wird, um einen Bluetooth LE-Werbebericht zu erhalten.