目录
1.首先在AndroidManifest.xml里面加以下权限代码。
2.其次在程序的主入口添加如下代码,用以询问用户是否开启定位权限。
一、问题描述
公司的源代码编译install到设备后,在蓝牙搜索列表找不到节点的名称信息,进而无法进行后续的温湿度测量、光照测量等操作。
公司给的代码可以在Android5.0直接运行。但是更高的版本则无法运行。
二、排查过程
1.电脑端的安卓开发版本
经过排查,与电脑端的安卓Sdk版本关系不大,只要不是太老的Sdk版本即可。(PS:本人电脑的Sdk版本为AndroidAPI32)
2.设备的安卓版本
只需满足:手机或Pad的安卓版本对应的API版本不能比 bulid.gradle下的miSdk限制更小。(如下图所示)
三、问题分析
蓝牙分为经典蓝牙和低功耗蓝牙,我们需要开发的是低功耗蓝牙。
通过查阅官方API,发现Android6.0以上版本低功耗蓝牙BluetoothGATT发生了一些区别,加入了距离检测的功能,也就是使用的时候需要手动开启定位权限。
四、解决办法
1.换用Android5.0的设备
公司给的代码可以直接在Android5.0上运行。因此可以换相应的设备。
2. 加几行权限申请代码。
以下方法仅在Android7.0设备上进行调试无误。
1.首先在AndroidManifest.xml里面加以下权限代码。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- ACCESS_FINE_LOCATION:允许一个程序访问精确位置(如GPS) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- ACCESS_COARSE_LOCATION:允许一个程序访问CellID或WiFi热点来获取大致的位置 -->
2.其次在程序的主入口添加如下代码,用以询问用户是否开启定位权限。
除了把报红的地方的class导入,还要设置一个常量值。(效果如下图)
//添加如下代码,并且为 PERMISSIONS_REQUEST_CODE_ACCESS常量赋值1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA,}, PERMISSIONS_REQUEST_CODE_ACCESS);
}
3.第三期培训视频
第三期培训视频里面说将targetAPI改成22什么的,没试过,不知道是否可行。
五、Result
程序需要手动开启定位权限。
搜索到了蓝牙设备名称,且功能正常。