Android蓝牙连接之SPP协议
Android蓝牙协议分为两种,SPP协议和BLE(Bluetooth low energy),Android4.3以上加入了低功耗蓝牙即BLE蓝牙协议,本篇文章我主要介绍下spp蓝牙协议的一些特性(BLE协议后期会陆续更新)。
比如我们需要实现一个如下图这样功能
1.如何获取当前手机已经绑定了的蓝牙设备?
// 获取默认的蓝牙adapter
BluetoothAdapter mBtAdapter=BluetoothAdapter.getDefaultAdapter();
// 获取当前可用的蓝牙设置
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
得到当前的蓝牙设备后,就可用通过遍历pairedDevices ,得到当前手机已经配对过的蓝牙设备。
2.如何扫描得到附近的可用蓝牙设备?
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
mBtAdapter.startDiscovery();
ArrayAdapter<String> mNewDevicesAdapter = new ArrayAdapter<String>(this,
R.layout.device_name);
由于安卓中获取附近蓝牙设备是通过广播机制去接收的,所以得注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, filter);
/**
* 监听搜索到的设备
*/
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
LogUtils.getInstance().e(getClass(), "----ACTION_FOUND---");
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
if(!TextUtils.isEmpty(device.getName())){
if(device.getName().equals("小米手机")){
mNewDevicesAdapter.add(device.getName() + "\n"
+ device.getAddress());
}
}
}
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)) {
LogUtils.getInstance().e(getClass(), "----ACTION_DISCOVERY_FINISHED----");
setProgressBarIndeterminateVisibility(false);
setTitle(R.string.select_device);
if (mNewDevicesAdapter.getCount() == 0) {
String noDevices = getResources().getText(
R.string.none_found_device).toString();
mNewDevicesAdapter.add(noDevices);
}
}
}
};
if (device.getBondState() != BluetoothDevice.BOND_BONDED):
如果当前蓝牙设备不是出于已经配对的状态的话,直接添加到可用蓝牙的列表,此处我已经筛选出蓝牙名称必须是“小米手机”
BluetoothDevice.ACTION_FOUND这个action是已经发现的蓝牙事件;
BluetoothAdapter.ACTION_DISCOVERY_FINISHED是蓝牙扫描结束的事件;
整个系列流程的代码我贴在下面:
/**
* @description:此类为扫描和连接蓝牙设备弹出框 扫描和连接蓝牙设备
* @author:zzq
* @time: 2016-8-5 下午午03:59:58
*/
public class DeviceListActivity extends Activity {
public static String EXTRA_DEVICE_ADDRESS = "device_address";
private BluetoothAdapter mBtAdapter;
private ArrayAdapter<String> mPairedDevicesAdapter;
private ArrayAdapter<String> mNewDevicesAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.device_list);
setResult(Activity.RESULT_CANCELED);
Button scanButton = (Button) findViewById(R.id.button_scan);
scanButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
discoverDevice();
}
});
mPairedDevicesAdapter = new ArrayAdapter<String>(this,
R.layout.device_name);
mNewDevicesAdapter = new ArrayAdapter<String>(this,
R.layout.device_name);
// 已经绑定的设备
ListView pairedListView = (ListView) findViewById(R.id.paired_devices);
pairedListView.setAdapter(mPairedDevicesAdapter);
pairedListView.setOnItemClickListener(mDeviceClickListener);
// 搜索到的可用设备
ListView newListView = (ListView) findViewById(R.id.new_devices);
newListView.setAdapter(mNewDevicesAdapter);
newListView.setOnItemClickListener(mDeviceClickListener);
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, filter);
// 获取默认的蓝牙adapter
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
// 获取当前可用的蓝牙设置
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
for (BluetoothDevice device : pairedDevices) {
mPairedDevicesAdapter.add(device.getName() + "\n"
+ device.getAddress());
}
} else {
String noDevices = getResources().getText(R.string.none_paired)
.toString();
mPairedDevicesAdapter.add(noDevices);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mBtAdapter != null) {
mBtAdapter.cancelDiscovery();
}
this.unregisterReceiver(mReceiver);
}
/**
* 扫描本地可用的设备
*/
private void discoverDevice() {
setProgressBarIndeterminateVisibility(true);
setTitle(R.string.scanning);
findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);
//如果正在扫描,先停止扫描,再重新扫描
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
mBtAdapter.startDiscovery();
}
/**
* 监听搜索到的设备
*/
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
LogUtils.getInstance().e(getClass(), "----ACTION_FOUND---");
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
if(!TextUtils.isEmpty(device.getName())){
if(device.getName().equals("小米手机")){
LogUtils.getInstance().e(getClass(), "----device.getName():"+device.getName());
mNewDevicesAdapter.add(device.getName() + "\n"
+ device.getAddress());
}
}
}
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)) {
LogUtils.getInstance().e(getClass(), "----ACTION_DISCOVERY_FINISHED----");
setProgressBarIndeterminateVisibility(false);
setTitle(R.string.select_device);
if (mNewDevicesAdapter.getCount() == 0) {
String noDevices = getResources().getText(
R.string.none_found_device).toString();
mNewDevicesAdapter.add(noDevices);
}
}
}
};
private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
mBtAdapter.cancelDiscovery();
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
Intent intent = new Intent();
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
setResult(Activity.RESULT_OK, intent);
finish();
}
};
}
下一篇将为大家带来,spp协议蓝牙的连接过程,以及通过蓝牙来实现文字聊天。
更多安卓相关信息,请扫码关注公众号:lifeAndroid
Android蓝牙连接之SPP协议相关推荐
- android连接蓝牙耳机,蓝牙耳机厂家:Android蓝牙连接的一些心得
蓝牙耳机厂家最近做一个项目,主要是给蓝牙发送指令的,boss要求能够最快速度的搜索到蓝牙,并且发送数据. 刚开始也遇到很多133,各种断开连接的问题.android蓝牙搜索有两种方式,一种startL ...
- android蓝牙连接133问题的解决办法---(连接篇)
上一篇文章介绍了"蓝牙扫描",今天来说一下android蓝牙连接过程中133的问题: 我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率 ...
- android 蓝牙 连接失败,Android蓝牙连接 – 服务发现失败
我正在尝试创建一个基本的蓝牙应用程序,用于测试设备. 我从developer.android获得了代码. 这是链接: http : //developer.android.com/guide/topi ...
- Android蓝牙连接a2dp蓝牙耳机
开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果R1(Android8.0) 开发功能:Android中蓝牙连接A2DP设备,蓝牙耳机设备 功能 ...
- android蓝牙连接取消后怎么重新连上,重新启动后接收蓝牙连接更改
我试图与接收器一起检查与不同设备的蓝牙连接,然后将其记录在logcat中.它适用于正常情况,但在重新启动时会失败.重新启动后接收蓝牙连接更改 这是一个正常的工作流程: 手机上 切换蓝牙开/关 重启手机 ...
- Android 蓝牙连接
一.概述 蓝牙是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.最多可以同时和7个其它蓝牙设备建立连接,进行通信.蓝牙可分为两大类:传统蓝牙(蓝牙3.0规范之前),低功耗 ...
- DCloud UniAPP Android 蓝牙连接ESCPOS打印机
1.蓝牙打印引用文件 btprinter.js import context from "@/common/context.js" //上下文处理 用来保存绑定的蓝牙设备地址fun ...
- android蓝牙连接通信的实现
看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧. 首先要知道几个类,Bl ...
- Android蓝牙连接问题总结
最近开始接触Android的蓝牙设备问题,严格意义上来说,也算是第二次接触蓝牙机制了,之前对于蓝牙设备的整个过程,也不是太了解,只是接触了一些自己需要的部分.而这次应该算是比较深入的了解了蓝牙机制的部 ...
最新文章
- ICML进行时 | 一文看尽获奖论文及Google、Facebook、微软、腾讯的最新科研成果
- Python命令行参数解析模块------argparse
- ecshop 2.x/3.x sql注入/任意代码执行漏洞
- 按键控制LED实现启动、停止按钮
- [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
- 王爽汇编语言 实验11
- nginx哪个版本性能好_nginx性能为什么好
- buffer java nio_Java NIO深入理解Buffer(缓冲区)
- Python operator.truth()函数与示例
- MySQL启动参数(三) —— table_open_cache
- html表单php比较三个值大小,php比较多维数组中值的大小排...-array_filter()函数去掉多维数组...-php生成静态html文件的三种方法_169IT.COM...
- 完成一个简单的时间片轮转多道程序内核代码
- DiskGenius分区助手,5.1.2.766绿色单文件版更新上传
- 「PKUSC2018」星际穿越
- 动态3D特效壁纸软件Wallpaper Engine的免费获取及安装问题解决
- 面向对象--西餐厅(基础实现)
- 计算机的cpu占用到多少会卡,CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅...
- 记一次更换服务器主板需要设置的参数
- 【win】WINDOWS10系统自带桌面整理工具
- 一个人开发手游有多难
热门文章
- 夭寿啦!奔腾G3260成功安装黑苹果10.10!
- word刷子刷格式_利用word格式刷如何快速编辑不同格式的文字?
- 第二模块(函数编程(极速版))-第二章-常用模块
- 学计算机笔记本8gb够用吗,千元良品学习够用:酷比魔方iPlay40H平板电脑使用体验...
- 美团小程序框架 mpvue mvvm框架互通
- 【Mysql】mysql命令常用语句
- JLink NO JLINK DEVICE FOUND
- 【财富空间】湖畔大学梁宁:成就高的那批人,全都有同一种天分
- pyspark | 数据处理基本操作
- 汽车造型中 - A面是什么