前言

前一阵帮别人做个蓝牙的Android程序,调试的好好的, 用的自己的老手机,android 5.1、8.0的都是好好的能够搜索,但是交付过去,对方的华为p30 Android 10手机就是不行,这是什么原因呢,一阵挠头。。

分析

如要查找 BLE 设备,请使用 startLeScan() 方法。此方法将 BluetoothAdapter.LeScanCallback 作为参数。您必须实现此回调,因为这是返回扫描结果的方式。

代码示例

如下为扫描代码。

/**

* Activity for scanning and displaying available BLE devices.

*/

public class DeviceScanActivity extends ListActivity {

private BluetoothAdapter bluetoothAdapter;

private boolean mScanning;

private Handler handler;

// Stops scanning after 10 seconds.

private static final long SCAN_PERIOD = 10000;

...

private void scanLeDevice(final boolean enable) {

if (enable) {

// Stops scanning after a pre-defined scan period.

handler.postDelayed(new Runnable() {

@Override

public void run() {

mScanning = false;

bluetoothAdapter.stopLeScan(leScanCallback);

}

}, SCAN_PERIOD);

mScanning = true;

bluetoothAdapter.startLeScan(leScanCallback);

} else {

mScanning = false;

bluetoothAdapter.stopLeScan(leScanCallback);

}

...

}

...

}

加入需要的权限:

注意,权限中的android.permission.ACCESS_COARSE_LOCATION是Android 6.0以上需要添加的权限。具体原因是蓝牙可以用来获取到模糊定位,所以需要请求用户同意。

if (Build.VERSION.SDK_INT >= 23) {

int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);

if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){

//判断是否需要 向用户解释,为什么要申请该权限

if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION))

Toast.makeText(this,R.string.ble_need_location, Toast.LENGTH_LONG).show();

ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},1);

return;

}else{

}

}

官方解释

要在您的应用中使用蓝牙功能,您必须声明 BLUETOOTH 蓝牙权限。您需要此权限才能执行任何蓝牙通信,例如请求连接、接受连接和传输数据等。

考虑到 LE 信标通常与位置相关联,您还须声明 ACCESS_FINE_LOCATION 权限。没有此权限,扫描将无法返回任何结果。

注意:如果您的应用适配 Android 9(API 级别 28)或更低版本,则您可以声明 ACCESS_COARSE_LOCATION 权限而非 ACCESS_FINE_LOCATION 权限。

这里的意思即是, Android9或更低版本可以用ACCES S_COARSE_LOCATION 但是目标是以上的,即Android 10则需要ACCESS_FINE_LOCATION 权限了。

然后进行测试,找了同事的vivo android 10的手机换成新权限,确实ok了。哇,那这样的话,我如何保证新旧android版本的兼容性呢。

继续分析。

这里很重要的一点是我的build.gradle 配置

compileSdkVersion 29

buildToolsVersion "29.0.3"

defaultConfig {

*******

minSdkVersion 18

targetSdkVersion 29

这个配置其实也是主要原因,之前厂家提供的demo ok, 而我因为用的是新的编译版本,targetSdkVersion也是29 (Android 10).

这里就要引出另一个关于Android权限的问题。

自动调整权限

随着时间的推移,平台中可能会加入新的限制,要想使用特定 API,您的应用可能必须请求之前不需要的权限。因为现有应用假设可随意获取这些API 应用的访问权限,所以 Android 可能会将新的权限请求应用到应用清单,以免在新平台版本上中断应用。Android 将根据为 targetSdkVersion 属性提供的值决定应用是否需要权限。如果该值低于在其中添加权限的版本,则 Android 会添加该权限。

例如,API 级别 4 中加入了 WRITE_EXTERNAL_STORAGE 权限,用以限制访问共享存储空间。如果您的 targetSdkVersion 为 3 或更低版本,则会向更新 Android 版本设备上的应用添加此权限。

注意:如果某权限自动添加到应用,则即使您的应用可能实际并不需要这些附加权限,Google Play 上的应用列表也会列出它们。

为避免这种情况,并且删除您不需要的默认权限,请始终将 targetSdkVersion 更新至最高版本。可在

Build.VERSION_CODES 文档中查看各版本添加的权限。

请仔细了解这段话,主要句子Android 将根据为 targetSdkVersion 属性提供的值决定应用是否需要权限。如果该值低于在其中添加权限的版本,则 Android 会添加该权限。 假设应用可以获取这些API权限,则Android根据targetSdkVersion 决定应用是否需要权限。 即如果我gradle配置targetSdkVersion是29, 那没办法,android以为你知道你在干嘛, 你就必须声明ACCESS_FINE_LOCATION权限。

不过,另一方面,如果该值低于在其中添加权限的版本,则 Android 会添加该权限。 如果该值低于29, 则Android自动给我们这个权限。 即如果我targetSdkVersion 低于29, android就直接给我们这个权限了,这样程序也能直接运行在Android 10的平台上。

验证

话不多说,经过上边的分析,把build.gralde的配置targetSdkVersion 降低,这里设为26,运行程序,立马扫描到了蓝牙BLE低功耗设备。

问题搞定, 主要是需要明白其中的原理。

本文地址:https://blog.csdn.net/caizehui/article/details/107875427

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

android10蓝牙搜不到ble设备_Android BLE程序在Android 10手机搜不到设备问题分析相关推荐

  1. android10手机众筹,最小Android 10手机?屏幕仅3英寸的Jelly 2开始众筹

    原标题:最小Android 10手机?屏幕仅3英寸的Jelly 2开始众筹 DoNews 7月22日消息(记者 刘文轩)在那些已经逝去的智能手机中,Palm可以算是相当具有"考古" ...

  2. android10手机众筹,世界上最小的Android 10手机海外众筹,竟是来自中国?

    原标题:世界上最小的Android 10手机海外众筹,竟是来自中国? 在iPhone诞生之初,乔布斯曾经说过3.5英寸才是最完美的黄金尺寸,没有人会买大屏手机. 但如今手机屏幕变得越来越大,很多时候必 ...

  3. android easylink 搜索设备_Android BLE开发解析

    一.Ble蓝牙操作流程 蓝牙操作流程图 二.权限声明 1.在Android 6.0(targetSdkVersion小于23)之前在权限的获取和操作只需在AndroidManifest文件中声明这两个 ...

  4. Android10剪贴板,剪纸堆 Clip Stack - 轻量级剪贴板管理程序(支持 Android 10)

    编辑点评 剪贴板的历史记录这么看 剪纸堆 Clip Stack - 轻量级剪贴板管理程序(支持 Android 10) 介绍 剪纸堆 Clip Stack - 轻量级剪贴板管理程序(支持 Androi ...

  5. Android 荣耀手机搜不到蓝牙设备

    环境:荣耀Magic3 安卓12 App : targetSdk 32 已申请权限 Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BL ...

  6. 搜狐html5,手机搜狐率先发力Html5技术

    作为门户WAP新闻的创始门户之一,搜狐正在迎来一场技术上的新革命.据一位搜狐内部人士透露,手机搜狐网正在酝酿一次大的改版,手机搜狐网将会更名为"手机搜狐",域名也将由"w ...

  7. 手机搜狐 html5,手机搜狐网计划改版,将利用HTML5技术

    手机搜狐网正在酝酿一次大的改版,而此次改版后最大的变化则在于手机搜狐将利用HTML 5技术,实现Web App化,使任何一款手机自带浏览器或者第三方浏览器上输入Soh 作为门户WAP新闻的创始门户之一 ...

  8. 手机搜狐 html5,手机搜狐欲改版推全新域名及LOGO 着力Html5技术

    [TechWeb报道]作为门户WAP新闻的创始门户之一,搜狐正在迎来一场技术上的新革命.据一位搜狐内部人士透露,手机搜狐网正在酝酿一次大的改版,手机搜狐网将会更名为"手机搜狐",域 ...

  9. 手机搜狐 html5,手机搜狐欲改版推全新域名及LOGO 着力Html5

    [TechWeb报道]作为门户WAP新闻的创始门户之一,搜狐正在迎来一场技术上的新革命.据一位搜狐内部人士透露,手机搜狐网正在酝酿一次大的改版,手机搜狐网将会更名为"手机搜狐",域 ...

最新文章

  1. 人生赢家的三个最基本标准
  2. 「AI初识境」激活函数:从人工设计到自动搜索
  3. OPenfire简介
  4. pytorch 数据加载性能对比
  5. HTML语言:经典笔记(ZT)
  6. Fragment全解析系列
  7. centos 配置yum源
  8. Python编程基础:第四十九节 鸭子类型Duck Typing
  9. Caffe官方教程翻译(3):Siamese Network Training with Caffe
  10. 2021 程序媛跳槽记:学习计划篇(已收获字节等offer)
  11. 谷歌联合 Adobe 发布 Noto 字体【免费下载】
  12. 企业靠一套数据平台实现“低成本运营战略”,降低成本600万
  13. (图文)HBASE的知识点以及工作原理的详细解释--架构
  14. stringstream的使用
  15. 路由的跳转 , 动态路由的配置
  16. Java中9大内置基本数据类型Class实例和数组的Class实例(转载)
  17. python全栈测试开发_实践docker化的Python全栈自动化测试开源解决方案
  18. 让你认识Android 开发简介及应用程序架构示例
  19. 使用html链接上传木马,一段植入木马的html代码
  20. sre8 sre10_透过窥视镜:安全性和SRE

热门文章

  1. Random伪随机数
  2. 2022-04-03前端周报 排查问题要知识沉淀
  3. UDX710平台 NR针对N78和N79锁频操作
  4. 如何系统学习车载VCU电控开发
  5. JavaScript基础教程速学笔记
  6. shareTo 网页版分享
  7. 使用python实现矩阵
  8. 【C++】二叉搜索树解析
  9. aws lambda_在AWS Lambda上进行无服务器我的线性回归api
  10. CocoaPods pod instal慢、卡住解决方法