android 蓝牙搜索不到Ble设备
今天写好了项目准备交给测试人员去测试,但是问题来了,我平时运行的都是自己的手机,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设备相关推荐
- mac搜索不到共享计算机,mac蓝牙搜索找不到设备怎么处理 Mac蓝牙设备连不上的解决方法有哪些...
今天给大家带来mac蓝牙搜索找不到设备怎么处理,Mac蓝牙设备连不上的解决方法有哪些,让您轻松解决问题. mac蓝牙搜索找不到设备怎么办 Mac蓝牙设备连不上的原因解决方法.我们现在有很多人都在使用苹 ...
- android 蓝牙搜索代码,关于蓝牙设备搜索和Ble设备的搜索的简单调用方法
最近一段时间一直在调试蓝牙设备,论坛里面关于这方面资料的太少,特别是关于蓝牙4.0的案例,基本上没有,也只好摸石头过河了.目前的代码也就勉强能用,我希望在此抛砖引玉,大家一起来完善这一部分. 说明一下 ...
- android10蓝牙搜不到ble设备_Android BLE程序在Android 10手机搜不到设备问题分析
前言 前一阵帮别人做个蓝牙的Android程序,调试的好好的, 用的自己的老手机,android 5.1.8.0的都是好好的能够搜索,但是交付过去,对方的华为p30 Android 10手机就是不行, ...
- Android 蓝牙 搜索周围设备代码流程分析-framework到协议栈流程
本文详细的将Android 蓝牙扫描周围设备流程进行了梳理,从UI开始扫描到协议栈发送扫描命令到controller,进行了源码分析. 更多源码分析: android-蓝牙A2dp-avrcp-hfp ...
- Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据
由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试.经过商量,我负责 ...
- Android蓝牙搜索连接通信
蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙技术最初由电信巨头爱立 ...
- android 蓝牙搜索、配对连接通信总结
蓝牙协议可以实现一个蓝牙设备和6到8个蓝牙设备进行通信. 1.蓝牙搜索的实现 利用蓝牙的发现和完成动作动态注册广播接受者获得蓝牙设备. 第一步,获得蓝牙适配器 BluetoothAdapter mBt ...
- android10蓝牙搜不到ble设备_Android 6.0 扫描不到 Ble 设备需开启位置权限的方法
之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫描不到周围的 Ble 设备.后来发现 6.0 需要在应用运行过 ...
- 疑难杂症 解决Ubuntu16.04 蓝牙搜索不到附近设备 适用于18.04
文章目录 1. 问题描述 2. 问题症结 3. 解决办法 References 1. 问题描述 打开蓝牙搜索设备无果 2. 问题症结 终端下输入命令 dmesg | grep -i blue BCM: ...
最新文章
- java 值对象_java 中设计模式(值对象)的实例详解
- 项目范围管理:项目范围管理的概念
- arduino使用oled代码_Arduino提高篇06—温湿度OLED显示
- nodejs mysql 注入_node.js sql 注入攻击防御方法 (sql Injection)
- jmeter+WebDriver:启动浏览器进行web自动化
- 华为云副总裁薛浩:云原生视频服务,重塑体验,助力产业升级
- Alexa 世界网站排名研究
- 这家金融巨头,要让AI人脸识别大规模应用在银行领域
- lepus监控oracle数据库_实用脚本一键监控oracle数据库索引使用状况
- 用verilog实现一个 一位全加器
- 第一次制作中秋博饼小游戏的心得与吐槽(软件工程)
- airpods版本号_怎么看airpods版本号 苹果airpods查看固件版本教程详解
- 双重for循环 语法结构
- 简单python教程视频_学习Python其实超简单:只需要看这套视频,即可轻松从入门到精通...
- 发展心理学类毕业论文文献包含哪些?
- 为什么上传速度比下载速度慢
- winform 如何让 comboBox1 不能输入,只能下拉选择
- SCIENCE CHINA LATEX模板缺少的一个重要文件psfig.sty,File `picins.sty’ not found.
- Java Excel省市区级联菜单设置
- java计算机毕业设计基于ssm的汽车租赁出租系统(源代码+数据库+Lw文档)