学习路线

1 蓝牙权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> //安卓6.0版本需要位置权限

2 打开蓝牙

public void onOpen(View v) {
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //获取蓝牙适配器 if (!bluetoothAdapter.isEnabled()) { //如果蓝牙是关闭的,则打开
bluetoothAdapter.enable();
showMessage("Open bluetooth");
} else {
showMessage("Bluetooth is already open");
}
}

3 扫描周围蓝牙(获取配对蓝牙)

扫描周围的蓝牙需要定义一个广播接收器

private BroadcastReceiver mReceiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
Log.i("boye", action);
if(action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //获取当前扫描到的设备 if(device.getBondState()==BluetoothDevice.BOND_BONDED) {               //显示已配对设备
textView.append("\n"+device.getName()+"==>"+device.getAddress()+"\n");
Toast.makeText(context, "发现已配对设备:" + device.getName(), Toast.LENGTH_LONG).show();
} else if(device.getBondState()!=BluetoothDevice.BOND_BONDED) {
textView3.append("\n"+device.getName()+"==>"+device.getAddress()+"\n");
Toast.makeText(context, "发现未配对设备:" + device.getName(), Toast.LENGTH_LONG).show();
}
} else if(action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
textView2.setText("搜索完成...");
}
}
};

广播过滤器

IntentFilter filter=new IntentFilter(BluetoothDevice.ACTION_FOUND);                  //过滤出发现
registerReceiver(mReceiver,filter); //注册广播
IntentFilter filter2=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //过滤出扫描结束
registerReceiver(mReceiver,filter2); //注册广播

4  蓝牙配对

public void createBond(BluetoothDevice btDev, Handler handler) {
if (btDev.getBondState() == BluetoothDevice.BOND_NONE) {
//如果这个设备取消了配对,则尝试配对
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //安卓版本大于等于4.3
btDev.createBond();
}
} else if (btDev.getBondState() == BluetoothDevice.BOND_BONDED) {
//如果这个设备已经配对完成,则尝试连接
connect(btDev, handler);
}
}

5  蓝牙的连接

private void connect(BluetoothDevice btDev, Handler handler) {
try {
//通过和服务器协商的uuid来进行连接
mBluetoothSocket = btDev.createRfcommSocketToServiceRecord(BltContant.SPP_UUID);
if (mBluetoothSocket != null)
//全局只有一个bluetooth,所以我们可以将这个socket对象保存在appliaction中
BltAppliaction.bluetoothSocket = mBluetoothSocket; Log.i("blueTooth", "开始连接...");
//在建立之前调用
if (getmBluetoothAdapter().isDiscovering())
//停止搜索
getmBluetoothAdapter().cancelDiscovery();
//如果当前socket处于非连接状态则调用连接
if (!getmBluetoothSocket().isConnected()) {
//你应当确保在调用connect()时设备没有执行搜索设备的操作。
// 如果搜索设备也在同时进行,那么将会显著地降低连接速率,并很大程度上会连接失败。
getmBluetoothSocket().connect();
}
Log.i("blueTooth", "已经连接");
if (handler == null) return;
//结果回调
Message message = new Message();
message.what = 4;
message.obj = btDev;
handler.sendMessage(message);
} catch (Exception e) {
Log.i("blueTooth", "...连接失败");
try {
getmBluetoothSocket().close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}

6  蓝牙通信

(1)发送消息

public static void sendMessage(String message) {
if (BltAppliaction.bluetoothSocket == null || TextUtils.isEmpty(message)) return;
try {
//message += "\n";
OutputStream outputStream = BltAppliaction.bluetoothSocket.getOutputStream();
outputStream.write(message.getBytes("utf-8"));
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
} }

(2)接收消息

public static void receiveMessage(Handler handler) {
if (BltAppliaction.bluetoothSocket == null || handler == null) return;
try {
InputStream inputStream = BltAppliaction.bluetoothSocket.getInputStream();
byte[] buffer = new byte[200];
inputStream.read(buffer);
Log.i("boye收到的信息",new String(buffer)); Message message = new Message();
message.obj = new String(buffer);
message.what = 1;
handler.sendMessage(message); } catch (IOException e) {
e.printStackTrace();
}
}

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

  1. Android 蓝牙学习

    Android 蓝牙学习 学习缘由 上个礼拜公司要开发个简单的五子棋游戏!其中一个需求就是支持蓝牙对战!所以苦逼的我学习蓝牙方面的知识了! 简介 Bluetooth是目前使用最广泛的无线通讯协议,近距 ...

  2. Android蓝牙学习笔记

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

  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. easyUI中datagrid的使用

    easyUI中的datagrid数据表格经常被用到,结合项目中的使用情况,总结一下datagrid使用中需要注意的一些问题.使用datagrid展示数据,需要在html.css.js中都要编写代码,h ...

  2. jQuery 对页面元素的搜索包括父元素、同辈元素、子元素的搜索

    1.父元素搜索 (1)parents([selector]) 方法 $("p").parents().css("border","1px solid ...

  3. 用PetaPoco为ASP.NET已有数据库建模

    序:最近一直在抓紧重构公司的网站,没有很多时间去写博客,积累了很多的问题,几乎是一天一个,折腾死了,尤其是在模型方面几经周折. 以前,多半从事PHP开发,很少接触到模型(thinkphp中模型),但是 ...

  4. Lock使用实例

    using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; usin ...

  5. Spring boot 默认静态资源路径与手动配置访问路径

    在application.propertis中配置 ##端口号server.port=8081 ##默认前缀spring.mvc.view.prefix=/## 响应页面默认后缀spring.mvc. ...

  6. Kafka权威指南——broker的常用配置

    前面章节中的例子,用来作为单个节点的服务器示例是足够的,但是如果想要把它应用到生产环境,就远远不够了.在Kafka中有很多参数可以控制它的运行和工作.大部分的选项都可以忽略直接使用默认值就好,遇到一些 ...

  7. Linux文件查看与查找命令

    cat  查看一个文件 -E: 显示行结束符$ -n: 对显示出的每一行进行编号 -A:显示所有控制符 -b:非空行编号 -s:压缩连续的空行成一行 -T:显示制表符 常用:cat -An /etc/ ...

  8. 安装mongodb后启动报错libstdc++

    安装mongo后启动报错如下图 显然说是libstdc++.so文件版本的问题,这种一般都是gcc版本太低了 接着查询gcc的版本    strings /usr/lib/libstdc++.so.6 ...

  9. Jmeter 初学(一)

    Jmeter 目前属于比较流行的测试工具,即可做自动化测试也可以做性能测试,而且比较方便. 环境准备: Jmeter 运行环境需要跑在java环境,首先需要安装一下java的环境,由于我目前使用的Jm ...

  10. SQLCODE=-668, SQLSTATE=57016, SQLERRMC=7

    当前表出于 装入暂挂状态,使用重组命令(reorg) 不起作用,报SQL-104, 然后从网上百度了大量解除 DB2暂挂的命令均不好使,最后采用了对表的runstats单个优化,也是类似reorg的单 ...