学习路线

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. C语言学习第六章

    今天开始尝试改变! 今天要学习函数,一个C语言中的重要组成部分. 首先先聊聊为什么要使用函数?随着学习的深入很多人会发现某段的代码重复使用的几率很大,而如果用一次写一次的话很明显的效率就会比较低,如果 ...

  2. bzoj4810 [Ynoi2017]由乃的玉米田

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一 ...

  3. uoj#73 【WC2015】未来程序

    在 2047 年,第 64 届全国青少年信息学奥林匹克冬令营前夕,B君找到了 2015 年,第 32 届冬令营的题目来练习. 他打开了第三题 “未来程序” 这道题目: 本题是一道提交答案题,一共 10 ...

  4. String,StringBuilder,StringBuffer的对比测试

    public class TestString { private static final int COUNT = 10000000; public static void main(String ...

  5. css元素水平垂直居中的十种方法

    四月底在杭州金诚的前端面试过程中,问到了父元素中子元素水平和垂直居中的方式,因为平时疏于整理,只说上来两种.后来面试过了,所以现在回想到这个问题,所以针对各种情况集中整理一下. 首先看页面结构和元素的 ...

  6. lightOJ 1258 Making Huge Palindromes(KMP)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1258 就是求逆串和原串的匹配长度 答案就是原串长度的2倍减去匹配长度即可 第一次我将原 ...

  7. 通过BitSet完成对单词使用字母的统计

    什么是BitSet BitSet类实现了一组位或标记(flag),这些位可被分别设置或清除.当需要跟踪一组布尔值时,这种类很有用. 您只需让每一位对应一个值,并根据需要设置或清除即可. 标记(flag ...

  8. UDP协议详解

    1.UDP协议的作用 IP协议无法区别同一个主机系统上的多个应用程序.UDP采用端口标识同一主机上的不同应用程序. 无法采取进程ID来标识不同应用程序的原因: 1)系统中应用程序的进程ID分配和销毁是 ...

  9. 高性能网站架构设计之缓存篇(1)- Redis C#客户端

    一.什么 RedisREmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包括 ...

  10. SUSE 11下安装DPDK

    SUSE下安装与centos下安装有稍许不同: # cd  dpdk-1.8.0 # grep -rn Werror . |grep -iE "Makefile|mk" |awk ...