学习路线

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. JS模式---命令模式

    var opendoor = { execute: function () { console.log("开门"); } }; var closedoor = { execute: ...

  2. 关于使用mybatis的几点总结

    mybatis的几点总结 1.关于resultType和resultMap的使用 查询结果集统一采用resultType,不要采用resultMap,因为resultMap需要写许多的表字段和实体类的 ...

  3. ie8兼容background-size属性

    满心欢喜地写代码,最后测试兼容性的时候发现Logo图片在IE8下特别大.明显是background-size在ie8一下不兼容. 我懂得,IE8还是个孩子,我就加几句你独有的代码让你兼容吧,司空见惯了 ...

  4. 浅析被element.style所覆盖的样式

    近日,我在用swiper插件写一个手游官网时,出现了一个很奇怪的问题.问题如下 如上图所示,这里是一个可以左右拖动的ul,每一个英雄介绍都是一个li标签,上图这是正常的情况.可是,它会随机不定期不定时 ...

  5. 蓝桥杯-兰顿蚂蚁-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  6. Scrollview中嵌套ListView(自定义组件解决)

    首先,ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,L ...

  7. js实用方法记录-js动态加载css、js脚本文件

    js实用方法记录-动态加载css/js 附送一个加载iframe,h5打开app代码 1. 动态加载js文件到head标签并执行回调 方法调用:dynamicLoadJs('http://www.yi ...

  8. dbunit进行DAO层Excel单元测试

    DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点: ...

  9. html学习笔记 - sublime text 插件安装

    command + shift + p 呼出搜索界面 输入 Packge Control:Install Package 进入到插件搜索列表 Emmet -- >快速生成html标签结构 Emm ...

  10. Homebrew安装和使用

    ## homebrew使用1. 安装 `$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...