在调用蓝牙方面,接触最多的可能是BluetoothAdapter,很多操作蓝牙的方法多在此类中有接口,哪怕很多接口是不公开的,也可以通过反射的方式使用,如设置蓝牙永久可见和关闭可见的函数;而开启蓝牙大体逻辑为:

  1. 开启蓝牙权限
  2. 注册蓝牙广播
  3. 初始化BluetoothAdapter实例
  4. 开启蓝牙
  5. 设置可见或不可见

Bluetooth权限

AndroidManifest.xml 中注册

    <!-- 允许程序连接到已配对的蓝牙设备 --><uses-permission android:name="android.permission.BLUETOOTH" /><!-- 允许程序发现和配对蓝牙设备 --><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Bluetooth广播注册

if (mReceiver == null) { //蓝牙广播注册mReceiver = new CustomBroadcastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BluetoothDevice.ACTION_FOUND);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mReceiver, intentFilter);
}

Bluetooth 广播Receiver

在启动蓝牙搜索时,系统会发送3个 action

BluetoothAdapter.ACTION_DISCOVERY_STARTED  //启动蓝牙搜索
BluetoothDevice.ACTION_FOUND  //查找到的结果
BluetoothAdapter.ACTION_DISCOVERY_FINISHED //结束蓝牙搜索

在自定义BroadcastReceiver中接受处理action; 这里需要注意的是:
@1开启蓝牙
@2接收ACTION_STATE_CHANGED广播
@3蓝牙状态是打开状态 (BluetoothAdapter.getState() == BluetoothAdapter.STATE_ON)
@4 设置蓝牙永久可见 setDiscoverableTimeout(0);

  • 这个顺序执行才能让你的蓝牙可以打开和可见

以下是搜索蓝牙的具体方法:

private class CustomBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {Log.d(TAG, "正在扫描设备,请稍候...");} else if (action.equals(BluetoothDevice.ACTION_FOUND)) {BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (device.getBondState() == BluetoothDevice.BOND_BONDED) { //TODO 可使用} else {   //TODO 可配对}} else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {Log.d(TAG, "扫描结束");}if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {Log.d(TAG, "--------打开蓝牙-----------");setDiscoverableTimeout(0); //蓝牙可见} else if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF) {Log.d(TAG, "--------关闭蓝牙-----------");}}}}

Android6.0蓝牙搜索需要定位权限,具体博文请看Android6.0权限详解, 蓝牙搜索使用的权限申请方法如下:

private void mayRequestLocation(){Log.d(TAG, "mayRequestLocation: androidSDK--" + Build.VERSION.SDK_INT);if(Build.VERSION.SDK_INT >= 23){//6.0以上设备int checkCallPhonePermission = checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "mayRequestLocation: 请求粗略定位的权限");requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);return;}}
}

Bluetooth的适配器实例化和开启bluetooth

BluetoothAdapter 自身定义静态函数,获取适配器对象
public static synchronized BluetoothAdapter getDefaultAdapter()

        if (!mBluetoothAdapter.isEnabled()) { //检测是否开启mBluetoothAdapter.enable();   //打开蓝牙}

Bluetooth 的可见和不可见

可见:
通过系统setting强制开启,直接从后台开启蓝牙可见,但会一直可见下去,直到蓝牙关闭。

    private void setDiscoverableTimeout(int timeout) {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();try {Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);setDiscoverableTimeout.setAccessible(true);Method setScanMode = BluetoothAdapter.class.getMethod("setScanMode", int.class, int.class);setScanMode.setAccessible(true);setDiscoverableTimeout.invoke(adapter, timeout);setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);} catch (Exception e) {e.printStackTrace();}}

不可见:
关闭了蓝牙可见性。

    private void closeDiscoverableTimeout() {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();try {Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);setDiscoverableTimeout.setAccessible(true);Method setScanMode = BluetoothAdapter.class.getMethod("setScanMode", int.class, int.class);setScanMode.setAccessible(true);setDiscoverableTimeout.invoke(adapter, 1);setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE, 1);} catch (Exception e) {e.printStackTrace();}}

BluetoothAdapter的常用方法

getAddress() //获取本地蓝牙地址getDefaultAdapter() //获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdaptergetName() //获取本地蓝牙名称getRemoteDevice(String address) //根据蓝牙地址获取远程蓝牙设备getState() //获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)isDiscovering() //判断当前是否正在查找设备,是返回trueisEnabled() //判断蓝牙是否打开,已打开返回true,否则,返回falselistenUsingRfcommWithServiceRecord(String name,UUID uuid) //根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步startDiscovery() //开始搜索,这是搜索的第一步BluetoothAdapter里的方法很多,常用的有以下几个:cancelDiscovery()  //根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索disable() //关闭蓝牙enable() //打开蓝牙,这个方法打开蓝牙不会弹出提示

开启蓝牙并设置永久可见相关推荐

  1. win10打开蓝牙_Win10开启蓝牙移动热点共享上网教程

    MS酋长之前已经分享过Win10创建移动热点的教程,其中提到可以通过蓝牙共享上网,有小伙伴就很困惑,能创建WiFi热点谁会用蓝牙连接呢?你还别说,真有广大校园里的难兄难弟难姐难妹们需要这个.因为众所周 ...

  2. win10打开蓝牙_Win10隐藏技巧:如何一键开启蓝牙功能!

    作者:蝈蝈   来源:每天学点电脑知识(id:diannao_88) 随着win10操作系统不断的更新,现在越来越多的用户使用上了win10系统.那么,小伙伴你们都知道怎么在win10系统中开启蓝牙功 ...

  3. 计算机开启蓝牙网络,电脑蓝牙怎么开?

    原创电脑蓝牙怎么开? 编辑:小葫芦 来源:PC下载网时间:2018-06-22 10:25:07 很少人知道电脑中也是有蓝牙的,那么电脑蓝牙到底该如何开启? 1.蓝牙是大家日常生活中经常用到的功能,一 ...

  4. win10开启蓝牙虚拟串口

    一.一点说明 首先确保你的电脑是有蓝牙的硬件设备的,因为并不是所有的电脑都自带蓝牙功能.这一点可以在设备管理器中查看,比如: 如图可见博主的电脑是有蓝牙功能的. 只是默认情况下,笔记本的蓝牙都不开启虚 ...

  5. 【Ubuntu】在Ubuntu中设置永久的DNS

    1.问题描述 ping不通域名,比如"ping www.baidu.com"时,报错"ping: unknown host www.baidu.com".这是因 ...

  6. Typecho给文章设置永久链接

    说明 想要给Typecho文章一个独立的url,或按照自己的格式来 这时候我们就要设置永久链接 Typecho设置文章永久链接 设置伪静态 伪静态设置要取决于是nginx还是apache ,详情请参考 ...

  7. 不仅有史上最详细Docker 安装Minio Client,还附带解决如何设置永久访问和永久下载链接!!(详图)绝对值得收藏的哈!!!!

    背景: 这两天在整理知识点,然后在学习Minio,一开始遇到更新,整了我不少时间,之前用的太久了,改了不少东西.用了之后发现不知道怎么设置成永久访问,就出了这篇文章. 史上最详细Docker安装最新版 ...

  8. [转]cmd 设置环境cmd环境变量命令set 设置永久环境变量命令setx

    set命令 set命令用于设置当前cmd窗口中的环境变量,只在当前cmd窗口有效,cmd窗口关闭后将会失效.而其不会影响到系统中保存的用户环境变量, setx命令 setx设置永久用户环境变量 set ...

  9. 在Mac上唤出「快速备忘录」的开启与关闭设置教程

    苹果在macOS 12提供了「快速备忘录」的功能,预设是可以让我们很快地从画面的右下角开启快速备忘录,今天这篇文章就要教大家如何在Mac上开启.关闭快速备忘录的设置. Mac快速备忘录开启与关闭设置方 ...

最新文章

  1. SQL中truncate table和delete的区别
  2. android 的view绘制逻辑
  3. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
  4. MyBatis-21MyBatis高级结果映射【一对多映射(2种方式)】
  5. python 类和对象 有必要学吗_类与对象-python学习19
  6. 18张动图,向你展示难得一见的瞬间
  7. [已送完]赠送Google Wave 邀请码
  8. ObjectDataSource自定义分页
  9. 创造思维方法训练_数学思维方法训练课程:每日一题11.23
  10. acm题库及答案 java_ACM试题及答案.docx
  11. 安装西门子博图一直重启_西门子博图重启后继续安装没完成的程序怎么去除?...
  12. java开发常用在线工具整理
  13. Kafka的消息可靠性(防止消息丢失)
  14. 深圳大学计算机考研初试+复试经验
  15. matlab画出鸢尾花数据集散点图尾花,鸢尾花数据集分以及绘制散点矩阵图
  16. SQL server 身份验证
  17. 比较全的Struts介绍04
  18. MATLAB完美画图:改变坐标轴刻度的显示数值,常数函数的作图
  19. Metamask如何关闭隐私模式,可以正常读取账号信息
  20. 力扣 1818. 绝对差值和 数学 二分

热门文章

  1. AJAX局部刷新数据
  2. typora快捷键不能用
  3. win10设置开机自动自动
  4. 华为系统鸿蒙3.0,华为鸿蒙操作系统正式发布!引起沸腾!速看
  5. ITerm2安装美化
  6. iTerm2 标题 Title
  7. Jave基础面试总结
  8. OSPF双点双向重发布实验
  9. 打破双亲委派机制有什么用_tomcat打破双亲委派机制
  10. 弱网测试----苹果手机