Android 6.0 扫描不到 Ble 设备需开启位置权限

之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫描不到周围的 Ble 设备。后来发现 6.0 需要在应用运行过程中请求位置权限,并且还要打开位置。

动态申请位置权限 ACCESS_COARSE_LOCATION

在 AndroidManifest.xml 文件中加入

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

然后在程序运行过程中进行申请

private static final int REQUEST_CODE_ACCESS_COARSE_LOCATION = 1; ... if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//如果 API level 是大于等于 23(Android 6.0) 时 //判断是否具有权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //判断是否需要向用户解释为什么需要申请该权限 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { showToast("自Android 6.0开始需要打开位置权限才可以搜索到Ble设备"); } //请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_ACCESS_COARSE_LOCATION); } }

执行完上面的请求权限后,系统会弹出提示框让用户选择是否允许改权限。选择的结果可以在回到接口中得知:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_ACCESS_COARSE_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //用户允许改权限,0表示允许,-1表示拒绝 PERMISSION_GRANTED = 0, PERMISSION_DENIED = -1 //permission was granted, yay! Do the contacts-related task you need to do. //这里进行授权被允许的处理 } else { //permission denied, boo! Disable the functionality that depends on this permission. //这里进行权限被拒绝的处理 } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }

以上就是如何在应用运行的过程中申请位置权限。做完上面你以为就 OK 了,但是可能你会发现,并没有什么卵用,依然不能搜索到周围的 Ble 设备,原因是可能的你的位置服务(定位 GPS)没有打开。

打开定位 (Location)

首先检查定位是否打开,可以像下面这样操作:

/*** Location service if enable** @param context* @return location is enable if return true, otherwise disable.*/
public static final boolean isLocationEnable(Context context) { LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); boolean networkProvider = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); boolean gpsProvider = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (networkProvider || gpsProvider) return true; return false; }

如果定位已经打开,OK 很好,可以搜索到 ble 设备;如果定位没有打开,则需要用户去打开,像下面这样:

private static final int REQUEST_CODE_LOCATION_SETTINGS = 2; ... private void setLocationService() { Intent locationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); this.startActivityForResult(locationIntent, REQUEST_CODE_LOCATION_SETTINGS); }

进入定位设置界面,让用户自己选择是否打开定位。选择的结果获取:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_LOCATION_SETTINGS) { if (isLocationEnable(this)) { //定位已打开的处理 } else { //定位依然没有打开的处理 } } else super.onActivityResult(requestCode, resultCode, data); }

OK,6.0 的系统对于用户的隐私保护更好了,但是对于开发者而言就是麻烦,但是那能咋办,撸码呗。

转载于:https://www.cnblogs.com/Free-Thinker/p/6673678.html

Android 6.0 扫描不到 Ble 设备需开启位置权限相关推荐

  1. android10蓝牙搜不到ble设备_Android 6.0 扫描不到 Ble 设备需开启位置权限的方法

    之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫描不到周围的 Ble 设备.后来发现 6.0 需要在应用运行过 ...

  2. android ble 设备扫描程序,Android应用开发Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备...

    本文将带你了解Android应用开发Android 7.0  BLE scan 问题:程序无错但扫描不到BLE设备,希望本文对大家学Android有所帮助. < 最近在做毕设,需要几周内从头学起 ...

  3. Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备

    最近在做毕设,需要几周内从头学起Android及BLE开发,遇到了N个坑. 最近好不容易看懂了各路BLE例程东拼西凑出了一个自己的版本,仅有Scan及显示BLE设备的功能,编译一切正常,然而按下sca ...

  4. android 6.0蓝牙服务开启,Android应用开发之Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法...

    本文将带你了解Android应用开发Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法,希望本文对大家学Android有所帮助. 为提供更高的数据保护   Android6.0版本 ...

  5. android 6.0省电,谷歌发话:强制开启Android 6.0省电模式和全盘加密

    原标题<谷歌发话了:谁都不许动省电模式和全盘加密>,IT之家编辑酌情修改. 日前谷歌已经发布了Android 6.0 Marshmallow的源码,手机厂商们正在加紧为旗下设备的适配工作, ...

  6. Android 5.0 Termux 配置米家设备环境[Alpine Linux]

    1. 前提 在配置米家设备环境之前我们先分析一下目前市面上能打通小米设备的API 或者开源软件.分别需要做哪些工作. 通过python-miio库实现对米家设备的控制 先例1:https://sspa ...

  7. android 6.0蓝牙,Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法

    为提供更高的数据保护 Android6.0版本上增加了关于Wifi和蓝牙的权限. 蓝牙搜索到设备需要用到定位服务,所以在开发中 targetSdkVersion 大于等于23(6.0) 需要在代码中进 ...

  8. 魅族android n内测报名,不再万年Android 5.0! Flyme安卓N内测招募开启

    科客点评:恰逢Flyme五周年庆,这算的是给煤油们最大的礼物. 近日,魅族Flyme系统非常活跃,为国内友商操碎了心,为此适配了一众友商热门机型,刷了不少存在感,但这显然不是魅族要搞的"大事 ...

  9. android 开启gps 简书,Android蓝牙第三方库FastBle使用注意事项(需开启GPS定位)

    纯手打,不喜勿喷 long may the sun shine 由于项目需要,今天打开了一个旧项目,想看看其中的搜索附近的蓝牙这个功能.但是尝试了很多次之后,发现仍然搜索不到任何蓝牙设备.这个项目蓝牙 ...

  10. Android 10.0动态修改系统属性设备型号(Build.MODEL)

    定制化开发中设备型号(ro.product.model)的修改,可以在\build\tools\buildinfo.sh中修改,不过这种方式只能写死了, 所以需要根据不同情况动态修改设备型号 就得修改 ...

最新文章

  1. 一台 Java 服务器可以跑多少个线程?
  2. 想写游戏吗?手把手教你SDL的安装及配置(亲测有效!)
  3. 命名空间和模块化编程3
  4. 【maven】mvn -pl 指定模块
  5. [hdu5270]按位统计,容斥,归并
  6. Scala 函数式编程_部分应用函数_Partially Applied Functions
  7. python库安装错误 in _error_catcher解决之镜像安装
  8. Node.js笔记-使用socket.io构建websocket聊天室
  9. 给php添加标题的代码,纯代码给WP网站的分类和Tag页面添加自定义标题
  10. PSD分层素材模板,快速设计美妆类海报
  11. python连接access 参数太少_paip. 解决php 以及 python 连接access无效的参数量。参数不足,期待是 1”的错误...
  12. redis cluster迁移相关
  13. 编程大讲坛 坛坛是佳酿--编程大讲坛:C语言核心开发技术从入门到精通
  14. 63. (FileInputStream)输入字节流
  15. gaster字体转换器_wingdings
  16. java中的implement怎么用?
  17. mysql给一张表做快照_MySQL之快照读
  18. matlab ptb安装,PTB之MATLAB编程:实验流程
  19. java计算机毕业设计基于安卓Android的禁毒宣传APP
  20. 回声消除(AEC)原理

热门文章

  1. window.open在Safari浏览器出现的问题
  2. centos6.5 搭建时间服务器
  3. 盘点欧洲五大智慧城市典范
  4. tomcat安全加固配置手册
  5. 动态的显示当前的时间---setInterval的用法
  6. 使用内部类或者外部类
  7. ACL在QinQ port 中的应用
  8. javascript:document.all document.getElementsByName
  9. svn checkout的时候报E000022错误
  10. python 阿里云短信接口_阿里云短信接口怎么使用