Android 蓝牙学习


学习缘由

上个礼拜公司要开发个简单的五子棋游戏!其中一个需求就是支持蓝牙对战!所以苦逼的我学习蓝牙方面的知识了!

简介

  • Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通讯的标准。传说瑞典有个国王特别爱吃蓝莓导致自己的牙齿天天都是蓝色的,在他执政期间这位国王非常善于交际,能说会到,和邻国的搞得关系非常好,这个Bluetooth的发明者觉得蓝牙它的作用就是在近距离沟通周围的设备,跟这个国王很类似,于是起名叫蓝牙。

  • 主要针对短距离设备通讯(10米)

  • 无线耳机,无线鼠标,无线键盘

Android 中的使用

蓝牙 API 简单简介

  • BluetoothAdapter (蓝牙本地适配器)

    1. cancelDiscovery() 停止当前搜索蓝牙的 Task
    2. disable() 关闭蓝牙
    3. enable() 打开蓝牙
    4. getAddress() 得到本地蓝牙适配器的地址
    5. getBondedDevices() 得到已经绑定的蓝牙的设备
    6. getDefaultAdapter() 得到本地蓝牙适配器
    7. getName() 得到本地蓝牙的名称
    8. getRemoteDevice(byte[] address) 得到远程蓝牙设备
    9. getRemoteDevice(String address) 得到远程蓝牙设备
    10. isEnabled() 判断蓝牙是否打开
    11. setName(String name) 设置蓝牙名称
    12. startDiscovery() 开始搜多附近蓝牙
    13. listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid) 创建 BluetoothServerSocket
  • BluetoothDevice

    1. createBond() 蓝牙配对 (低版本不支持,>=api19)
    2. createRfcommSocketToServiceRecord(UUID uuid) 创建 BluetoothSocket
    3. getBondState() 得到配对的状态
    4. getAddress() 得到远程蓝牙适配器的地址
    5. getName() 得到远程蓝牙的名称
  • BluetoothSocket 与 BluetoothServerSocket

    这两个 API 和Socket 和ServerSocket 差不多 这里不予介绍

    *** 当然了,Android 中蓝牙相关的API还很多!这里我只说了几个常用的!!!! ***

Android 中的实战

** 现在我们就按照正常的逻辑来走! **

第一步

我们要先得到 蓝牙本地适配器,来判断设备是否支持蓝牙!

    mAdapter=BluetoothAdapter.getDefaultAdapter();
//判断设备是否支持蓝牙
if (mAdapter==null){
Toast.makeText(this, "不支持蓝牙", Toast.LENGTH_SHORT).show();
}
第二步

好了!现在下面要做的就是判断蓝牙是否打开了!没有打开则打开!

	if (!mAdapter.isEnabled()){//蓝牙没有打开
// mAdapter.enable();//不支持这样写,影响用户体验 //建议使用这种方式
Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, 200);
}

代码写得很清楚!我就不解释啦!!!

第三步

成功打开蓝牙之后,要想别人的适配上能够发现,我们得设置蓝牙的可见性,现在我就来设置蓝牙的可见性!看代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==200){
Intent dis=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
dis.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(dis);
}
}

不知大家有没有注意到,我是在 onActivityResult(int requestCode, int resultCode, Intent data) 这个回调函数中设置蓝牙可见性的!因为我们在打开蓝牙的时候用了 startActivityForResult(Intent intent,int requestCode) 这个方法!还有一点大家也要注意 就是蓝牙在设置可见性的时候,有个时常。就是这个字段 BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION 对应的值!这个最大值是300秒!

第四步

至此,我们就可以搜索附近的蓝牙啦!那么有同学会问了,我们怎么知道有设备被搜索到呢?这个很简单哦!但我们搜索到设备的时候,系统就会给我们发送广播啦!我们只有注册个广播接收器就行啦!

  mAdapter.startDiscovery();//开始搜索

 //注册蓝牙广播接收器。
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);//发现蓝牙动作
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索结束动作
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//搜素开始动作
registerReceiver(blueReceiver, filter); /**
* 蓝牙接收器
**/
public class BlueReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
deviceList.add(device);
adapter.notifyDataSetChanged();
}
if (intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) { }
if (intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) { }
}
}

BlueReceiver 中我只是简单的把搜索到得设备放到集合中。被没有做过多的操作!

第五步

现在到了比较重要的步骤了!当我们搜索到了蓝牙的之后,我要配对,因为只有在配对之后才能连接哦!

  BluetoothDevice device = (BluetoothDevice) adapter.getItem(i);
if (device.getBondState() == BluetoothDevice.BOND_BONDED) {//是否已配对
connect(device);
} else { try {
Method boned=device.getClass().getMethod("createBond");
boolean isok= (boolean) boned.invoke(device);
if(isok)
{
connect(device);
}
} catch (Exception e) {
e.printStackTrace(); } }

这里,我想说明的是就是这个配对,在 API19 之后 createBond() Android对外提供了这个方法!但是在 API19 以前并没有提供这个方法,所以呢我只能用反射了!这个兼容性比较好奥!!

第六步

现在,就很简答啦!只要连接就行啦!在这里我放在了一个线程中了!

private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) {
mmDevice = device;
BluetoothSocket tmp = null; try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "create() failed", e);
}
mmSocket = tmp;
} @Override
public void run() {
Log.i(TAG, "BEGIN mConnectThread");
setName("ConnectThread"); mAdapter.cancelDiscovery();
try { mmSocket.connect(); } catch (IOException e) {
connectionFailed();
try {
mmSocket.close();
} catch (IOException e2) {
Log.e(TAG, "unable to close() socket during connection failure", e2);
}
BlueToothService.this.start();
return;
} synchronized (BlueToothService.this) {
mConnectThread = null;
} connected(mmSocket, mmDevice);//这里是另外一个读取数据的线程,这里就和socket操作一样了
write("start".getBytes());
} public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
}
}
}

** 好啦!如果你读到这里 就也就学会了蓝牙的简单操作了! **

Android 蓝牙学习的更多相关文章

  1. Android蓝牙学习笔记

    一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...

  2. android蓝牙学习

    学习路线 1 蓝牙权限 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses ...

  3. android蓝牙打印机

    您还未登录!|登录|注册|帮助 首页 业界 移动 云计算 研发 论坛 博客 下载 更多 reality_jie的专栏 编程的过程是一种微妙的享受       目录视图 摘要视图 订阅 CSDN2013 ...

  4. android 蓝牙4.0 开发介绍

    最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...

  5. 【转】android蓝牙开发---与蓝牙模块进行通信--不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...

  6. Android 蓝牙开发(整理大全)

    Android蓝牙开发 鉴于国内Android蓝牙开发的例子很少,以及蓝牙开发也比较少用到,所以找的资料不是很全. (一): 由于Android蓝牙的通信都需要用到UUID,如果由手机发起搜索,当搜索 ...

  7. android -- 蓝牙 bluetooth (四)OPP文件传输

    在前面android -- 蓝牙 bluetooth (一) 入门文章结尾中提到了会按四个方面来写这系列的文章,前面已写了蓝牙打开和蓝牙搜索,这次一起来看下蓝牙文件分享的流程,也就是蓝牙应用opp目录 ...

  8. 深入了解Android蓝牙Bluetooth——《基础篇》

    什么是蓝牙?   也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的.利用"蓝牙"技术,能够有效地简化掌上电脑.笔记本电 ...

  9. 深入了解Android蓝牙Bluetooth——《进阶篇》

    在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/6046846 ...

随机推荐

  1. 使用spring AOP获得session的思路

    由于Spring 的AOP面向切面编程,与Servlet容器没有任何关联,所以想要获得Session会话比较麻烦. 当然Struts2同样不依赖Servlet容器,可以在Spring AOP中可以使用 ...

  2. C#基础—不安全代码(unsafe code)

    1.为何要有unsafe 也许是为了实现CLR类型安全的目标吧,默认情况下,C#没有提供指针的使用算法,但是有些情况下也可能需要指针这样直接访问内存的东西(虽然目前我还没有用过),但是有时候程序员非常 ...

  3. js 获取中文的拼音首字母

    es6 + 模块化封装 "use strict"; module.exports = { //参数,中文字符串 //返回值:拼音首字母串数组 makePy (str) { if ( ...

  4. java程序猿常用Linux命令

    1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的xm ...

  5. unity, stateMachine, change state name

    如图,假设wingsLayer下有个state,叫“New State“,现在想给它改名,则一定要保证当前wingsLayer为选中状态,然后才能在Inspector中可以为其改名.否则若当前选中的不 ...

  6. 11个常用的Linux命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.今天为你解释下面几个命令:sudo.python.mtr.Ctrl+x+e.nl.s ...

  7. [svc]entrypoint.sh shell脚本解析

    最近搞influxdb绘图,看到其dockerfile的entry.sh,无奈看的不是很懂. 于是查了下.. docker run 通过传参实现配置文件覆盖 实现启动镜像时候可指定配置文件 如果不指定 ...

  8. gdb,程序调试助手

    启动GDB:(其中我的app是编译之后的可执行文件) 退出命令:quit或者简写q 帮助获取: gdb通过完备的在线帮助,使我们使用起来更加方便.所有的帮助信息都是通过help命令获得的,运行help ...

  9. TIM—基本定时器

    本章参考资料:< STM32F4xx 参考手册>.< STM32F4xx 规格书>.库帮助文档< stm32f4xx_dsp_stdperiph_lib_um.chm&g ...

  10. 一款jquery和css3实现的卡通人物动画特效

    之前为大家分享了很多jquery和css3的动画实例.今天给大家带来一款非常炫的jquery和css3实现的卡通人物动画特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...