android 蓝牙 setscanmode,蓝牙LE扫描在后台无法在Android M上运行
以下代碼適用于運行Android 5.1.1(Build LMY48M)的Nexus 9,但不適用于運行Android 6.0的Nexus 9(Build MPA44l)
List filters = new ArrayList();
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() {
...
});
在Android 5.x上,當看到與掃描過濾器匹配的制造商廣告時,上述代碼產生回調. (參見下面的示例Logcat輸出.)在帶有MPA44l的Nexus 9上,沒有收到回調.如果您注釋掉掃描過濾器,則會在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}
有沒有人看過ScanFilters在Android M上工作?
解決方法:
我的應用程序連接到藍牙也有類似的問題.不是LE ScanFilter,但它就像OP一樣是權限問題.
根本原因是從SDK 23開始,您需要使用Activity的requestPermissions()方法在運行時提示用戶獲取權限.
這對我有用:
>將以下兩行之一添加到根節點內的AndroidManifest.xml中:
>在您的Activity中,在嘗試連接到藍牙之前,請調用Activity的requestPermissions()方法,該方法打開系統對話框以提示用戶獲取權限.權限對話框在另一個線程中打開,因此在嘗試連接到藍牙之前一定要等待結果.
>覆蓋Activity的onRequestPermissionsResult()來處理結果.如果用戶拒絕授予權限,該方法實際上只需要做一些事情,告訴用戶應用程序無法進行藍牙活動.
This blog post有一些示例代碼,它使用AlertDialogs告訴用戶發生了什么.這是一個很好的起點,但有一些缺點:
>它不處理等待requestPermissions()線程完成
>包含對requestPermissions()的調用的AlertDialog對我來說似乎是無關緊要的.對requestPermissions()的裸調用就足夠了.
總結
以上是生活随笔為你收集整理的android 蓝牙 setscanmode,蓝牙LE扫描在后台无法在Android M上运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 相机路径,android
- 下一篇: android 组件 线程,Androi