2015-10-10 8 views
12

Mam aplikację korzystającą z Bluetooth i podłączenie do urządzeń, nie mogę znaleźć żadnych urządzeń za pomocą BluetoothAdapter.getDefaultAdapter(). startDiscovery(); To działało dobrze tuż przed odkryciem. Wypróbował też inne aplikacje, nie działa też w innych aplikacjach. Ale urządzenie, które próbuję sparować (Arduino bt-module) można znaleźć w ustawieniach Androida. Jakiś pomysł, co mogę spróbować? Zaimplementowałem wszystko jak opisano na http://developer.android.com/guide/topics/connectivity/bluetooth.html i działało przed aktualizacją.Od czasu uzyskania przez marshmallow aktualizacji Bluetooth za pomocą BluetoothAdapter.getDefaultAdapter(). StartDiscovery(); jest uszkodzony

Odpowiedz

30

Adapter Bluetooth została zmiana w Androidzie 6.0

Musisz ustawić uprawnienie ACCESS_FINE_LOCATION zezwolenie lub ACCESS_COARSE_LOCATION i trzeba użyć BluetoothLeScanner.startScan() metoda aby rozpocząć skanowanie.

Poniżej znajduje się opis ze zmianami dzienników:

aby zapewnić użytkownikom większą ochronę danych w systemie Android 6.0, Android usuwa programowy dostęp do lokalnego identyfikatora sprzętowego urządzenia dla aplikacji korzystających z Wi-Fi i Bluetooth Pszczoła. Metody WifiInfo.getMacAddress() i BluetoothAdapter.getAddress() zwracają teraz stałą wartość 02: 00: 00: 00: 00: 00.

Aby uzyskać dostęp identyfikatory sprzętowe pobliskich urządzeń zewnętrznych poprzez Bluetooth i Wi-Fi skanów, Twoja aplikacja musi teraz mieć ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION uprawnienia:

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

Uwaga: Gdy urządzenie z systemem Android poziomu 6,0 (API 23) inicjuje skanowanie w tle Wi-Fi lub Bluetooth, operacja jest widoczna dla urządzeń zewnętrznych jako pochodzące z losowego adresu MAC.

Możesz uzyskać więcej informacji z tego linku: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

+3

Dzięki za podpowiedź, tym rozwiązaniem dla mnie było dodanie uprawnienia ACCESS_FINE_LOCATION i żądanie zgody w czasie wykonywania. – mikugo

+0

@mikugo Czy nadal używasz 'BluetoothAdapter.getDefaultAdapter().startDiscovery(); 'do inicjowania wykrywania? Zmiany wspominają używanie LEScannera zamiast Marshmallow i zastanawiają się, czy dokonano zmiany, aby skanować nawet klasyczne urządzenia bluetooth. – jschlepp

+0

@jschlepp Tak Używam 'BluetoothAdapter.getDefaultAdapter(). StartDiscovery();' to był tylko mały projekt uniwersytecki. Ale może LEScanner może również odkryć klasyczne urządzenia, ponieważ używają tej samej częstotliwości. I zużywa mniej energii. – mikugo

5

Wystarczy włączyć Lokalizacja w Ustawieniach i działa dobrze !!

2

Z poziomu interfejsu API 23 wymagane jest również zezwolenie na dostęp do lokalizacji (ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION) do wykrywania urządzeń Bluetooth.

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

I właśnie dodając uprawnienia do pliku manifestu nie jest wystarczające jako uprawnienie należy do „niebezpieczne” poziom ochrony. Aby uzyskać zezwolenie w czasie wykonywania, wymagana jest zgoda użytkownika.

pozwolenie Dodane do 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" /> 

Zapytanie o ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION w czasie wykonywania:

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; 
    } 
} 

Więcej szczegółów o pozwolenie: https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

Powiązane problemy