今天写好了项目准备交给测试人员去测试,但是问题来了,我平时运行的都是自己的手机,sdk版本是5.0(21)的,但是测试组给我的手机是安卓4.4的,结果搜都搜不到Ble设备,苦逼了好久,我拿了一个demo对比,发现demo可以搜索的到,然后我就对着代码看,看完了也没发现个所以然,最后我决定自己写个demo,很简单,只要实现搜索功能就可以了,结果并没什么卵用,依然搜不到,我是知道adapter只提供了两个搜索方法的,但是鉴于在每个公司的产品都不同,最好设定uuid去搜索。于是换了个方法,然后我去掉了uuid,结果Log就打印出来了,好吧,这都不是问题,反正在android 5.0版本是可以秒杀扫出的,于是做个版本判断吧。希望能帮到此时还在烦恼的你。

--------------------------分割线--------------------------

绕回来了,今天在android6.0设备上搜索蓝牙,结果又是搜索不到,百度搜了一下,重要在stackoverflow上找到了答案。

虽然android快要发布7.0了,可是我们好像还没用上6.0,可是如果发布了7.0,我们离用上6.0还会久吗?

先说一下,虽然下面这个方法已经在5.0给抛弃了,但是还是可以用,因为android在5.0以后可以让手机作为BLE设备端,

估计整合了一下方法吧,所以下面的方法被废弃了。

boolean startLeScan(BluetoothAdapter.LeScanCallback callback)

Starts a scan for Bluetooth LE devices.
boolean startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)

Starts a scan for Bluetooth LE devices, looking for devices that advertise given services.

我试过新方法也是可以搜索的,就是参数设置比较麻烦,有兴趣的朋友自己去试试。下面说下我是怎么解决在6.0上搜索蓝牙

因为在android6.0对安全权限做了很大的改变,同时搜索蓝牙是需要在AndroidManifest.xml上添加

  uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION

如果在studio上设置目标版本是6.0的话,则需要请求上面这个权限,代码如下

 // 判断蓝牙是否开启    if(mBluetoothAdapter.isEnabled()){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {final AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("This app needs location access");builder.setMessage("Please grant location access so this app can detect Bluetooth.");builder.setPositiveButton(android.R.string.ok, null);builder.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);}}});builder.show();}}}/****对授权做处理,0代表授权,-1拒绝授权*/@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {switch (requestCode) {case PERMISSION_REQUEST_COARSE_LOCATION: {if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {// Log.d(TAG, "coarse location permission granted");finish();} else {final AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("Functionality limited");builder.setMessage("Since location access has not been granted, this app will not be able to discover beacons when in the background.");
                  builder.setPositiveButton(android.R.string.ok, null);builder.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {}});builder.show();}return;}}}

以上工作只是打开权限而已,或许你会发现设置了上面代码要求了位置权限是可以搜索蓝牙,为什么呢,因为会在Location打开GPS,这时候试试关闭GPS,而这个权限请求是完成的,你会发现根本搜索不到蓝牙,为什么呢?能所有蓝牙的关键原因是打开了GPS,soga,那知道问题就好办了,我们只要打开GPS就行了,下面是判断GPS是否打开的代码:

 // Gps是否可用public static final boolean isGpsEnable(final Context context) {LocationManager locationManager= (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);if (gps || network) {return true;}return false;}

以上可以用于在点击搜索对GPS判断,打开的话直接搜索,没有打开的话就........那就打开呗。

我们可以通过startactivityforresult(activity,requestcode)这个方法来跳转到setting的Location界面,

        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);activity.startActivityForResult(intent,requestCode);

打开GPS,然后返回就可以收到Ble设备了!

其实我并没有用上面那么的权限代码,只要设置目标版本不是6.0,设为5.0,同时打开GPS,同样可以实现Ble设备在6.0上的搜索功能!

至此,已经解决了搜索蓝牙这个问题

下面贴一下我写的代码

               if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if(isGpsEnable(this)){// gps 已开,接下来请求定位权限,已授权则开始搜索,未授权则提示权限通知requestLocationPermission()}else {// 通过Intent 进入GPS设置界面,这里建议用startActivityForResult()进入GPS设置界面,// 并在onActivityResult()方法做处理,判断gps是否打开,未打开给出提醒,打开了进入定位权限流程liteble.enableLocation(this,PERMISSION_REQUEST_COARSE_LOCATION);Toast.makeText(this,R.string.openGps,Toast.LENGTH_LONG).show();}return;}showListView();

在点击按钮的时候,先判断android版本,如果是6.0就判断GPS有没有打开,打开了再判断权限是否已申请,申请了直接去搜索,没有打开就跳转到打开GPS界面,6.0版本一下就直接搜索了,是不是发现很简单?

------------------------------------------------------------------------------

更新于 2017/1/22

关于权限问题,不推荐大家使用我上面的方法,在这给大家推荐一个权限的库,

谷歌自己出品的 EasyPermission ,具体用法大家可以去github一下。

然后建议会RxJava的可以试一下 Rxpermission, 不过我是没有尝试,没有太多时间,很多人都再使用。

新出的手机基本都是6.0,有的还是7.0了,国内6.0慢慢的会全部普及,所以大家写程序的时候要适配好权限,基本权限库也是必备了。

------------------------------------------------------------------------------

更新于 2018/4/27

权限库还是建议使用RxPermission,相比EasyPermission 还是具有很大的优势的,不用写那么多接口注解,而且权限请求操作本就是观察者行为,天然符合Rx这种异步库,反正我推荐使用。

然后分享一下关于搜索很慢的问题
亲测手机蓝牙模块比较差的是ovb系列,不是我黑它,除了蓝牙模块还有WiFi模块也做的很烂,相比其它品牌手机,简直不止差一个档次,比较快的是华为,三星,小米魅族也还不错,所以对于有搜索时间限制的应用来说,需要给这三个品牌的手机开个后门,留有足够的时间

android 蓝牙搜索不到Ble设备相关推荐

  1. mac搜索不到共享计算机,mac蓝牙搜索找不到设备怎么处理 Mac蓝牙设备连不上的解决方法有哪些...

    今天给大家带来mac蓝牙搜索找不到设备怎么处理,Mac蓝牙设备连不上的解决方法有哪些,让您轻松解决问题. mac蓝牙搜索找不到设备怎么办 Mac蓝牙设备连不上的原因解决方法.我们现在有很多人都在使用苹 ...

  2. android 蓝牙搜索代码,关于蓝牙设备搜索和Ble设备的搜索的简单调用方法

    最近一段时间一直在调试蓝牙设备,论坛里面关于这方面资料的太少,特别是关于蓝牙4.0的案例,基本上没有,也只好摸石头过河了.目前的代码也就勉强能用,我希望在此抛砖引玉,大家一起来完善这一部分. 说明一下 ...

  3. android10蓝牙搜不到ble设备_Android BLE程序在Android 10手机搜不到设备问题分析

    前言 前一阵帮别人做个蓝牙的Android程序,调试的好好的, 用的自己的老手机,android 5.1.8.0的都是好好的能够搜索,但是交付过去,对方的华为p30 Android 10手机就是不行, ...

  4. Android 蓝牙 搜索周围设备代码流程分析-framework到协议栈流程

    本文详细的将Android 蓝牙扫描周围设备流程进行了梳理,从UI开始扫描到协议栈发送扫描命令到controller,进行了源码分析. 更多源码分析: android-蓝牙A2dp-avrcp-hfp ...

  5. Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据

    由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试.经过商量,我负责 ...

  6. Android蓝牙搜索连接通信

    蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙技术最初由电信巨头爱立 ...

  7. android 蓝牙搜索、配对连接通信总结

    蓝牙协议可以实现一个蓝牙设备和6到8个蓝牙设备进行通信. 1.蓝牙搜索的实现 利用蓝牙的发现和完成动作动态注册广播接受者获得蓝牙设备. 第一步,获得蓝牙适配器 BluetoothAdapter mBt ...

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

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

  9. 疑难杂症 解决Ubuntu16.04 蓝牙搜索不到附近设备 适用于18.04

    文章目录 1. 问题描述 2. 问题症结 3. 解决办法 References 1. 问题描述 打开蓝牙搜索设备无果 2. 问题症结 终端下输入命令 dmesg | grep -i blue BCM: ...

最新文章

  1. java 值对象_java 中设计模式(值对象)的实例详解
  2. 项目范围管理:项目范围管理的概念
  3. arduino使用oled代码_Arduino提高篇06—温湿度OLED显示
  4. nodejs mysql 注入_node.js sql 注入攻击防御方法 (sql Injection)
  5. jmeter+WebDriver:启动浏览器进行web自动化
  6. 华为云副总裁薛浩:云原生视频服务,重塑体验,助力产业升级
  7. Alexa 世界网站排名研究
  8. 这家金融巨头,要让AI人脸识别大规模应用在银行领域
  9. lepus监控oracle数据库_实用脚本一键监控oracle数据库索引使用状况
  10. 用verilog实现一个 一位全加器
  11. 第一次制作中秋博饼小游戏的心得与吐槽(软件工程)
  12. airpods版本号_怎么看airpods版本号 苹果airpods查看固件版本教程详解
  13. 双重for循环 语法结构
  14. 简单python教程视频_学习Python其实超简单:只需要看这套视频,即可轻松从入门到精通...
  15. 发展心理学类毕业论文文献包含哪些?
  16. 为什么上传速度比下载速度慢
  17. winform 如何让 comboBox1 不能输入,只能下拉选择
  18. SCIENCE CHINA LATEX模板缺少的一个重要文件psfig.sty,File `picins.sty’ not found.
  19. Java Excel省市区级联菜单设置
  20. java计算机毕业设计基于ssm的汽车租赁出租系统(源代码+数据库+Lw文档)

热门文章

  1. Proteus8.9 VSM Studio PIC编译器仿真PIC16F630_系列001_LED
  2. SpringCloud使用手册
  3. linux常见版本介绍
  4. C++实现员工工资管理系统
  5. Jaeger 详细配置
  6. jaeger分布式链路追踪
  7. 计算机教案课后记怎么写,教案后记怎么写
  8. 美团二面:让你怀疑人生的数据结构算法夺命连环17问~
  9. 深蹲的26种变化动作(深蹲大全)
  10. HDU-2121-Ice_cream’s world II