启用蓝牙可发现性Intent报错:无Activity处理该Intent的技术问询
解决Android蓝牙可发现性请求的ActivityNotFoundException问题
我来帮你搞定这个崩溃问题——你调用蓝牙可发现性请求时触发的ActivityNotFoundException,主要是两个细节没处理对,咱们一步步修复:
1. 先修正Manifest里的Intent过滤器错误
你在MainActivity的Intent过滤器里写了个多余的等号,这直接导致系统识别不了这个动作!看对比:
<!-- 你的错误写法 --> <action android:name="=android.bluetooth.adapter.action.REQUEST_DISCOVERABLE" /> <!-- 正确写法,去掉开头的等号 --> <action android:name="android.bluetooth.adapter.action.REQUEST_DISCOVERABLE" />
把那个多余的等号删掉,系统才能正确匹配到蓝牙可发现性的请求Intent。
2. 针对Leanback设备的兼容性处理
你的应用声明了android.software.leanback为必填项,说明是给电视这类Leanback设备开发的。有些Leanback设备的系统可能没有内置处理REQUEST_DISCOVERABLE的系统Activity,就算过滤器写对了,调用还是会崩溃。
给你个安全的调用方式:
在启动Intent之前,先检查系统有没有能处理它的Activity,避免崩溃:
public void enableDiscovery() { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); // 先判断当前设备能不能处理这个请求 if (discoverableIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(discoverableIntent, REQUEST_ENABLE_DISCOVERY); } else { // 设备不支持的话,给用户个提示 Toast.makeText(this, "当前设备无法设置蓝牙可发现性", Toast.LENGTH_SHORT).show(); } }
3. 额外提醒:动态权限申请
对于Android 6.0及以上版本,ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION这些权限需要动态申请,不然蓝牙功能可能跑不起来。你可以在调用蓝牙相关方法前,先检查并请求这些权限哦。
按上面的步骤改完,应该就能解决崩溃问题啦!
内容的提问来源于stack exchange,提问作者user3559233
相关产品推荐
相关产品推荐

