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
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
Gerade Standort in den Einstellungen aktivieren und es funktioniert gut !!
Ab API-Stufe 23 wird auch die Standortzugriffsberechtigung (ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION) für die Bluetooth-Erkennung benötigt.
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
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
@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
@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