Kurzversion:Verminderte BLE startScan Geräte auf Android erkannt 5.0 Lollipop
In meinen Tests mit Android 5.0 Lollipop Ich habe bemerkt, android.bluetooth.le.BluetoothLeScanner
weniger BLE Geräte erkennt häufig als Android 4.4 KitKat. Warum ist das und gibt es eine Alternative?
Lange Version:
ich eine Android-Anwendung entwickle, die speziell für das Nexus 7 Tablette, die auf der Erfassung Bluetooth Low Energy (BLE) Geräte konzentriert. Die App interessiert sich hauptsächlich für den RSSI-Wert der Beacons, um ihre Nähe zum Tablet zu ermitteln. Das bedeutet, dass ich keine Verbindung zum BLE-Gerät herstellen muss, da der RSSI-Wert beim Erkennen des Geräts an den Scan-Callback übergeben wird.
In Android 4.4 KitKat, wenn ich BluetoothAdapter.startLeScan(LeScanCallback)
anrufen, ruft mein Rückruf nur einmal für jedes erkannte BLE-Gerät. (Ich habe gesehen some discussions behaupten, dass dieses Verhalten je Gerät unterschiedlich sein kann) Ich interessiere mich jedoch für den ständig ändernden RSSI-Wert, so ist die derzeit empfohlene Möglichkeit, kontinuierlich startLeScan und stopLeScan mit einem festgelegten Intervall (250ms in meinem Fall):
Im Wesentlichen gibt dies mir die erforderlichen Ergebnisse, aber dieser Prozess ist sehr ressourcenintensiv und führt schließlich zu einem nicht reagierenden Bluetooth-Adapter.
Aus diesen Gründen habe ich mein Nexus 7 auf Android 5.0 Lollipop aufgerüstet, um zu sehen, ob meine BLE-Probleme behoben würden. In Lollipop ist BluetoothAdapter.startLeScan (LeScanCallback) veraltet und wird durch a new API ersetzt, was mehr Kontrolle über den Scanvorgang ermöglicht. Aus meinen ersten Tests scheint es startScan meinen Rückruf nicht ständig anrufen (auf meinem Nexus 7), wenn die RSSI-Werte ändern, so muß ich immer noch die startScan/stopScan Implementierung verwenden:
@TargetApi(21)
public class TheNewWay {
private static final int SCAN_INTERVAL_MS = 250;
private Handler scanHandler = new Handler();
private List<ScanFilter> scanFilters = new ArrayList<ScanFilter>();
private ScanSettings scanSettings;
private boolean isScanning = false;
public void beginScanning() {
ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder();
scanSettingsBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
scanSettings = scanSettingsBuilder.build();
scanHandler.post(scanRunnable);
}
private Runnable scanRunnable = new Runnable() {
@Override
public void run() {
BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
if (isScanning) {
scanner.stopScan(scanCallback);
} else {
scanner.startScan(scanFilters, scanSettings, scanCallback);
}
isScanning = !isScanning;
scanHandler.postDelayed(this, SCAN_INTERVAL_MS);
}
};
private ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
int rssi = result.getRssi();
// do something with RSSI value
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
// a scan error occurred
}
};
}
Wie Sie sehen können, Ich habe den Scanner mit der ScanSettings-Klasse konfiguriert, mit der Sie die scanMode
einstellen können. Ich benutze ScanSettings.SCAN_MODE_LOW_LATENCY
, die die folgende Dokumentation hat: "Scan mit höchster Auslastung. Es wird empfohlen, diesen Modus nur zu verwenden, wenn die Anwendung im Vordergrund ausgeführt wird." Klingt genau so, wie ich es will, aber leider bekomme ich nur alle 15 - 30 Sekunden eine Beacon-Erkennung, wobei die KitKat-Version mir alle 1 - 2 Sekunden das gleiche Beacon anzeigt.
Haben Sie eine Idee, was könnte der Grund für diesen Unterschied sein? Fehle ich etwas, vielleicht ein paar neue Einstellungen? Gibt es alternative Möglichkeiten, das oben genannte zu tun?
Vielen Dank im Voraus!
Abel
PS: Ich wollte mehr Links zu Ressourcen enthalten die ich verwendet habe, aber ich habe nicht die rep Punkte für ihn noch nicht.
In Lollipop "startet startScan nicht ständig meinen Rückruf (auf meinem Nexus 7), wenn sich die RSSI-Werte ändern". Aber wird es mindestens einmal oder nur einmal wieder aufgerufen? Entschuldigung, ich habe kein Nexus 7 zum Testen. In meinem Nexus 5 wird es jede Sekunde in SCAN_MODE_LOW_POWER aufgerufen. – sorianiv
@abelcookingfox Ich habe fast das gleiche schlimme Ergebnis wie du, ich benutze One-plus, CM ROM 5.0.2, manchmal das Scannen von über 30 Sekunden aufgerufen, aber manchmal ist es wie tot. Hast du jetzt eine Lösung? – Shawn
Ich habe den Test erneut durchgeführt, mein One plus one Telefon scannt nur 2 Mal, dann würde dieser Callback nie mehr ausgelöst werden. – Shawn