2015-10-10 11 views
12

Ich habe eine App mit Bluetooth und die Verbindung zu Geräten, kann finden Sie alle Geräte mit BluetoothAdapter.getDefaultAdapter(). startDiscovery(); Es funktionierte gut vor der Entdeckung. Versuchte auch andere Apps, es funktioniert auch nicht in anderen Apps. Aber das Gerät, das ich versuche zu koppeln (Arduino BT-Modul) kann in Android-Einstellungen gefunden werden. Irgendeine Idee, was könnte ich versuchen? Ich habe alles implementiert wie beschrieben unter http://developer.android.com/guide/topics/connectivity/bluetooth.html und es funktionierte vor dem Update.Seit Marshmallow Bluetooth-Erkennung mit BluetoothAdapter.getDefaultAdapter() aktualisieren. StartDiscovery(); ist defekt

Antwort

30

Bluetooth-Adapter hat Änderung wurde in Android 6.0

Sie benötigen die Erlaubnis ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION Erlaubnis zu setzen und müssen BluetoothLeScanner.startScan() Methode verwenden, um den Scanvorgang zu starten.

unter der Beschreibung von Änderungsprotokollen ist:

Benutzer mit besseren Datenschutz zu liefern, in Android 6.0, entfernt Android programmatischen Zugriff auf die lokale Hardware-Kennung des Geräts für Anwendungen, die Wi-Fi und Bluetooth APIs. Die Methoden WifiInfo.getMacAddress() und BluetoothAdapter.getAddress() geben jetzt einen konstanten Wert von 02: 00: 00: 00: 00: 00 zurück.

Um das Hardware-IDs von in der Nähe von externen Geräten über Bluetooth und Wi-Fi-Scans zugreifen kann, müssen Sie Ihre App haben nun die ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION Berechtigungen:

WifiManager.getScanResults() 
BluetoothDevice.ACTION_FOUND 
BluetoothLeScanner.startScan() 

Hinweis: Wenn ein Gerät mit Android 6.0 (API-Ebene läuft 23) initiiert einen Hintergrund Wi-Fi oder Bluetooth-Scan, der Vorgang ist sichtbar für externe Geräte als aus einer randomisierten MAC-Adresse stammen.

Sie können weitere Informationen über diesen Link erhalten: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

+3

Danke für den Hinweis, die Die Lösung für mich bestand darin, die Berechtigung ACCESS_FINE_LOCATION hinzuzufügen und die Berechtigung zur Laufzeit anzufordern. – mikugo

+0

@mikugo Verwenden Sie immer noch BluetoothAdapter.getDefaultAdapter().startDiscovery(); 'zum Einleiten der Erkennung? Die Änderungen erwähnen die Verwendung des LEScanners anstelle von Marshmallow und fragen sich, ob Sie die Änderung vorgenommen haben, um sogar nach klassischen Bluetooth-Geräten zu suchen. – jschlepp

+0

@jschlepp Ja, ich benutze 'BluetoothAdapter.getDefaultAdapter(). StartDiscovery();' es war nur ein kleines Universitätsprojekt. Aber vielleicht kann der LEScanner auch klassische Geräte entdecken, weil sie die gleiche Frequenz verwenden. Und es verbraucht weniger Energie. – mikugo

5

Gerade Standort in den Einstellungen aktivieren und es funktioniert gut !!

2

Ab API-Stufe 23 wird auch die Standortzugriffsberechtigung (ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION) für die Bluetooth-Erkennung benötigt.

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id

Und Erlaubnis gerade hinzufügen, in Manifest-Datei ist nicht ausreichend, da die Erlaubnis zu „gefährlich“ Schutzstufe gehört. Die Zustimmung des Benutzers ist erforderlich, um die Berechtigung zur Laufzeit anzufordern.

Added Erlaubnis in AndroidManifest.xml:

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

Antrag auf ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION zur Laufzeit:

private void accessLocationPermission() { 
    int accessCoarseLocation = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION); 
    int accessFineLocation = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); 

    List<String> listRequestPermission = new ArrayList<String>(); 

    if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) { 
     listRequestPermission.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); 
    } 
    if (accessFineLocation != PackageManager.PERMISSION_GRANTED) { 
     listRequestPermission.add(android.Manifest.permission.ACCESS_FINE_LOCATION); 
    } 

    if (!listRequestPermission.isEmpty()) { 
     String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]); 
     requestPermissions(strRequestPermission, REQUEST_CODE_LOC); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_LOC: 
      if (grantResults.length > 0) { 
       for (int gr : grantResults) { 
        // Check if request is granted or not 
        if (gr != PackageManager.PERMISSION_GRANTED) { 
         return; 
        } 
       } 

       //TODO - Add your code here to start Discovery 

      } 
      break; 
     default: 
      return; 
    } 
} 

Mehr Details über die Erlaubnis: https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

Verwandte Themen