今天早上做了一个android的App的一个蓝牙模块,刚开始使用了第三方的蓝牙操作库(为了偷懒)。。。调试的时候却发现一个问题,不论怎样都无法搜索到设备。
重新自己写一个操作库,一步一步检查,
蓝牙开启,权限加了,广播注册没有问题,和以前写的蓝牙模块也没什么区别啊。
What? 木有问题啊,为什么搜索不到设备呢,换了两部手机一样不行。
经过一番思考后,突然想起android从6.0开始一些权限需要动态注册,可能是这个问题。
果不其然,果然是动态权限注册的问题。
首先蓝牙操作都需要在Manifest中注册两个权限
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
其次在API 23及以上的版本都需要动态权限注册
而蓝牙则需要动态添加这两条权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
动态权限的注册方法
(这里用了第三方的动态权限注册库 AndPermission )
具体实现代码可以这样
AndPermission.with(this)
.permission(Manifest.permission.ACCESS_COARSE_LOCATION , Manifest.permission.ACCESS_FINE_LOCATION)
.callback(new PermissionListener() {
@Override
public void onSucceed(int requestCode, @NonNull List<String> grantPermissions) {
///权限注册成功时
}
@Override
public void onFailed(int requestCode, @NonNull List<String> deniedPermissions) {
MainActivity.this.finish();///注册失败时
}
})
.start();
ok完事,次饭!
Wi-Fi搜索设备也需要定位权限,且开启定位。