在安卓开发过程中遇到蓝牙扫描不到周围设备的问题,细看代码发现是bluetoothAdapter.startDiscovery()函数出现问题,该函数的作用及运行过程可以自己去别的地方看,大致过程就是:
创建一个线程用于蓝牙设备查找,
1.开始时会广播ACTION_DISCOVERY_STARTED消息,
2.找到一个设备广播一次ACTION_FOUND消息,
3.扫描结束后会广播ACTION_DISCOVERY_FINISHED消息
接下来介绍出现扫描不到周围设备的问题的原因:
1.网上最常见的回答:
在原来的App的AndroidManifest.xml中加入权限声明
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
2.函数调用前权限再次检查,本人使用的环境 targetSdkVersion 30,好像是比较新的安卓版本,对于权限管理比较严格,所以要在函数调用前再次检查蓝牙相关权限,调用我定义的如下checkPermissions函数即可。
private boolean checkPermissions(){
//本app需要以下权限
if(ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.BLUETOOTH},0);
System.out.println("-------已经申请了蓝牙权限1------");
}else{
System.out.println("-------已经拥有了蓝牙权限权限1------");
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.BLUETOOTH_ADMIN},0);
System.out.println("-------已经申请了蓝牙权限2------");
}else{
System.out.println("-------已经拥有了蓝牙权限权限2------");
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},0);
System.out.println("-------已经申请了定位权限1------");
}else{
System.out.println("-------已经拥有了定位权限1------");
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0);
System.out.println("-------已经申请了定位权限2------");
}else{
System.out.println("-------已经拥有了定位权限2------");
}
return true;
}
总结
越新的安卓版本对权限管理的越严格,大家再用到啥权限的时候,不仅要在AndroidManifest.xml文件中声明好,还要在具体的代码段前再次检查权限,防止没有起到功能。