Bluetooth-LE-Scan funktioniert nicht auf Android M im hintergrund
Der folgende code funktioniert Super auf meinem Nexus 9 läuft Android 5.1.1 (Build LMY48M), aber nicht auf ein Nexus 9 mit Android 6.0 (Build MPA44l)
List<ScanFilter> filters = new ArrayList<ScanFilter>();
ScanSettings settings = (new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)).build();
ScanFilter.Builder builder = new ScanFilter.Builder();
builder.setManufacturerData((int) 0x0118, new byte[]{(byte) 0xbe, (byte) 0xac}, new byte[]{(byte) 0xff, (byte)0xff});
ScanFilter scanFilter = builder.build();
filters.add(scanFilter);
mBluetoothLeScanner.startScan(filters, settings, new ScanCallback() {
...
});
Auf Android 5.x der obige code liefert ein Rückruf, wenn ein Hersteller Werbung passend zu den scan-filter zu sehen ist. (Siehe Beispiel Logcat Ausgabe unten.) Auf dem Nexus 9 mit MPA44l, keine Rückrufe erhalten werden. Wenn Sie kommentieren Sie den scan-filter, Rückrufe empfangen werden erfolgreich auf das Nexus 9.
09-22 00:07:28.050 1748-1796/org.altbeacon.beaconreference D/BluetoothLeScanner﹕ onScanResult() - ScanResult{mDevice=00:07:80:03:89:8C, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={280=[-66, -84, 47, 35, 68, 84, -49, 109, 74, 15, -83, -14, -12, -111, 27, -87, -1, -90, 0, 1, 0, 1, -66, 0]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=null], mRssi=-64, mTimestampNanos=61272522487278}
Hat jemand gesehen ScanFilters Arbeit an Android M?
- Brauchen Sie beide - NETWORK_PROVIDER und GPS_PROVIDER? Oder einfach nur NETWORK_PROVIDER. Mehr info hier: developer.android.com/guide/topics/connectivity/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ein ähnliches problem mit einer app Verbindung zu bluetooth. Nicht LE ScanFilter, aber es war ein Berechtigungen-Problem wie der OP hatte.
Ursache ist, dass beginnend mit der SDK 23, müssen Sie den Benutzer auffordern, für die Berechtigungen zur Laufzeit mit
Activity
'srequestPermissions()
Methode.Hier ist was für mich gearbeitet:
Fügen Sie eine der folgenden zwei Zeilen, um
AndroidManifest.xml
innerhalb der root-Knoten:In Ihrer Tätigkeit, bevor Sie versuchen, herstellen einer Verbindung mit bluetooth, Anruf
Activity
'srequestPermissions()
Methode, dem öffnet sich ein Dialogfeld fordert den Benutzer für die Berechtigung. Das Dialogfeld Berechtigungen wird geöffnet in einem anderen thread, so sicher sein, um auf das Ergebnis zu warten, bevor Sie versuchen, herstellen einer Verbindung mit bluetooth.Überschreiben
Activity
'sonRequestPermissionsResult()
um das Ergebnis zu behandeln. Diese Methode ist wirklich nur etwas tun müssen, wenn der Benutzer verweigert die Erlaubnis, um dem Benutzer mitzuteilen, dass die app nicht die bluetooth-Aktivität.In diesem blog-post hat einige Beispiel-code, der verwendet AlertDialogs, um dem Benutzer mitzuteilen, was Los ist. Es ist ein guter Ausgangspunkt, aber hat einige Mängel:
requestPermissions()
thread beendenrequestPermissions()
scheint Fremd zu mir. Ein bloßer AufrufrequestPermissions()
ist ausreichend.Das problem war nicht die scan-filter, aber dass die scan-filter wurde nur verwendet, wenn die app im hintergrund. Beginnend mit Android M, Bluetooth LE Scannen im hintergrund blockiert, es sei denn die app hat eine der folgenden zwei Berechtigungen:
Die app, die ich getestet habe keinen Antrag entweder der Berechtigungen, so dass es nicht im hintergrund arbeiten (nur mal den scan-filter aktiv war) auf Android M. Hinzufügen der erste, der das problem löste.
Merkte ich, das war das problem, da sah ich die folgende Zeile im Logcat:
Siehe hier für details: https://code.google.com/p/android-developer-preview/issues/detail?id=2964
Hinzufügen Standort zusammen mit BLE
Kopieren und Einfügen dieses Verfahren zu beantragen und zu gewähren Standort
Und dann in onCreate-check für die Erlaubnis
Hoffe, dass es sparen Sie Ihre Zeit.
Wenn Ihre app Zielvorgaben Android-Q, es ist nicht genug, nur mit grobem Lage, Sie benötigen, um feine location, sonst erhalten Sie diese Fehlermeldung:
Sehen https://developer.android.com/preview/privacy/camera-connectivity#fine-location-telephony-wifi-bt für die offizielle Quelle.