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协议相关推荐

  1. android连接蓝牙耳机,蓝牙耳机厂家:Android蓝牙连接的一些心得

    蓝牙耳机厂家最近做一个项目,主要是给蓝牙发送指令的,boss要求能够最快速度的搜索到蓝牙,并且发送数据. 刚开始也遇到很多133,各种断开连接的问题.android蓝牙搜索有两种方式,一种startL ...

  2. android蓝牙连接133问题的解决办法---(连接篇)

    上一篇文章介绍了"蓝牙扫描",今天来说一下android蓝牙连接过程中133的问题: 我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率 ...

  3. android 蓝牙 连接失败,Android蓝牙连接 – 服务发现失败

    我正在尝试创建一个基本的蓝牙应用程序,用于测试设备. 我从developer.android获得了代码. 这是链接: http : //developer.android.com/guide/topi ...

  4. Android蓝牙连接a2dp蓝牙耳机

    开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果R1(Android8.0) 开发功能:Android中蓝牙连接A2DP设备,蓝牙耳机设备 功能 ...

  5. android蓝牙连接取消后怎么重新连上,重新启动后接收蓝牙连接更改

    我试图与接收器一起检查与不同设备的蓝牙连接,然后将其记录在logcat中.它适用于正常情况,但在重新启动时会失败.重新启动后接收蓝牙连接更改 这是一个正常的工作流程: 手机上 切换蓝牙开/关 重启手机 ...

  6. Android 蓝牙连接

    一.概述 蓝牙是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.最多可以同时和7个其它蓝牙设备建立连接,进行通信.蓝牙可分为两大类:传统蓝牙(蓝牙3.0规范之前),低功耗 ...

  7. DCloud UniAPP Android 蓝牙连接ESCPOS打印机

    1.蓝牙打印引用文件 btprinter.js import context from "@/common/context.js" //上下文处理 用来保存绑定的蓝牙设备地址fun ...

  8. android蓝牙连接通信的实现

    看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧. 首先要知道几个类,Bl ...

  9. Android蓝牙连接问题总结

    最近开始接触Android的蓝牙设备问题,严格意义上来说,也算是第二次接触蓝牙机制了,之前对于蓝牙设备的整个过程,也不是太了解,只是接触了一些自己需要的部分.而这次应该算是比较深入的了解了蓝牙机制的部 ...

最新文章

  1. ICML进行时 | 一文看尽获奖论文及Google、Facebook、微软、腾讯的最新科研成果
  2. Python命令行参数解析模块------argparse
  3. ecshop 2.x/3.x sql注入/任意代码执行漏洞
  4. 按键控制LED实现启动、停止按钮
  5. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
  6. 王爽汇编语言 实验11
  7. nginx哪个版本性能好_nginx性能为什么好
  8. buffer java nio_Java NIO深入理解Buffer(缓冲区)
  9. Python operator.truth()函数与示例
  10. MySQL启动参数(三) —— table_open_cache
  11. html表单php比较三个值大小,php比较多维数组中值的大小排...-array_filter()函数去掉多维数组...-php生成静态html文件的三种方法_169IT.COM...
  12. 完成一个简单的时间片轮转多道程序内核代码
  13. DiskGenius分区助手,5.1.2.766绿色单文件版更新上传
  14. 「PKUSC2018」星际穿越
  15. 动态3D特效壁纸软件Wallpaper Engine的免费获取及安装问题解决
  16. 面向对象--西餐厅(基础实现)
  17. 计算机的cpu占用到多少会卡,CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅...
  18. 记一次更换服务器主板需要设置的参数
  19. 【win】WINDOWS10系统自带桌面整理工具
  20. 一个人开发手游有多难

热门文章

  1. 夭寿啦!奔腾G3260成功安装黑苹果10.10!
  2. word刷子刷格式_利用word格式刷如何快速编辑不同格式的文字?
  3. 第二模块(函数编程(极速版))-第二章-常用模块
  4. 学计算机笔记本8gb够用吗,千元良品学习够用:酷比魔方iPlay40H平板电脑使用体验...
  5. 美团小程序框架 mpvue mvvm框架互通
  6. 【Mysql】mysql命令常用语句
  7. JLink NO JLINK DEVICE FOUND
  8. 【财富空间】湖畔大学梁宁:成就高的那批人,全都有同一种天分
  9. pyspark | 数据处理基本操作
  10. 汽车造型中 - A面是什么