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
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
Wystarczy włączyć Lokalizacja w Ustawieniach i działa dobrze !!
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.
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
- 1. Wykrywanie urządzeń Bluetooth w systemie Android - startDiscovery()
- 2. Bluetooth przez uart za pomocą hciattach?
- 3. System kompilacji QtCreator jest uszkodzony po aktualizacji OSX
- 4. Wiosna uszkodzony po aktualizacji do 1.4.0 od 1.3.x
- 5. Komunikacja między urządzeniami przez Bluetooth za pomocą Phonegapa na Androida?
- 6. Problemy z łącznością za pomocą Bluetooth Android
- 7. AWS czasu aktualizacji instancji RDS
- 8. jak naprawić uszkodzony npm po aktualizacji węzła
- 9. Rozróżnienie limitu czasu od anulowania przez użytkownika
- 10. Bluetooth: Wykryj zdarzenie za pomocą usługi Bluez
- 11. GLSL abs() jest uszkodzony?
- 12. Jaki jest najszybszy sposób aktualizacji istniejących rekordów za pomocą sekwencji?
- 13. AWS Obraz Lambda jest uszkodzony
- 14. Localizable.strings jest uszkodzony?
- 15. AJAX.BeginForm PostURL jest uszkodzony
- 16. Przewijanie listm z Androidem marshmallow jest rozmyte
- 17. Android przykładowy kod bluetooth, aby wysłać prosty ciąg przez bluetooth
- 18. Jaki jest lepszy sposób uzyskania całkowitego czasu wykonania aplikacji Node.js?
- 19. Wysyłanie wielu plików przez Bluetooth
- 20. Jak dokonać aktualizacji za pomocą msi
- 21. Jak otrzymać dane szeregowe za pomocą android bluetooth
- 22. Transfer plików przez Bluetooth Android
- 23. Jak usunąć łączniki za pomocą aktualizacji MySQL?
- 24. wysyłanie/odbieranie danych przez Bluetooth
- 25. Bonjour przez Bluetooth BEZ Gamekit?
- 26. Jak poprawić pomiar odległości Bluetooth za pomocą RSSI?
- 27. Wykrywanie usług zakończone niepowodzeniem za pomocą Bluetooth na Androidzie
- 28. Aplikacja do debugowania za pomocą ADB przez Bluetooth dla netbooka Android-x86
- 29. ustawianie wielu kolumn za pomocą jednej aktualizacji
- 30. Odbieranie dźwięku przez Bluetooth w Androidzie
Dzięki za podpowiedź, tym rozwiązaniem dla mnie było dodanie uprawnienia ACCESS_FINE_LOCATION i żądanie zgody w czasie wykonywania. – mikugo
@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
@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