android 蓝牙 setscanmode,蓝牙LE扫描在后台无法在Android M上运行

本文探讨了在Android M上使用ScanFilters时遇到的问题及解决方案。文中提到,在Android5.1.1上运行正常的应用在升级到Android6.0后出现无法接收到蓝牙设备回调的情况。文章详细解释了解决方案,即在运行时通过requestPermissions()方法请求用户授权。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码适用于运行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()的裸调用就足够了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值