蓝牙有关的操作
来源:互联网 发布:淘宝直播时怎么调镜像 编辑:程序博客网 时间:2024/06/05 00:23
用广播来蓝牙操作
我们在不开启手机自身的蓝牙开关情况下,对蓝牙打开和扫描,并列表的形式展现出来.
1.首先在添加权限,在配置文件中进行添加即可;
<use-permission android :name="android.permission.BLUETOOTH">
获取蓝牙适配器,就是机身的蓝牙适配器对象,所有与本机蓝牙有关的Activity都需要BlueAdapter对象,表示为设备自身的蓝牙适配器:
BlueToothAdapter ba=BlueAdapter.getDefaultAdapter();if(ba=null){ //该设备不支持蓝牙功能...}
2.接下来打开蓝牙,并监听蓝牙状态变化获取打开与否的信息
if(!ba.isEnable){ ba.enable();//强行打开蓝牙,也可以调用本地的api去打开 //用api打开蓝牙设备的思路是Intent启动本地的方法,然后在onActivityResult()中获取到打开信息}
如果我们想确切的知道是否打开的信息,可以通过注册广播来监听ACTION_STATE_CHANGED这个广播意图来知道蓝牙的改变状态,然后再去执行有关的业务.这个广播就是就是表征蓝牙的状态变化的,包括打开,关闭,这也是本文想描述的.当我们不知道本机的蓝牙功能是否开启的时候,就可以通过这种方式来确认;
BroadcastReceiver receiver=new BroadcastReciever(){public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { if(ba.getState()==BluetoothAdapter.STATE_ON){ //蓝牙打开后执行... } if(ba.getState()==BluetoothAdapter.STATE_OFF){ //蓝牙关闭后执行... } } };IntentFilter intentfilter=newIntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);registerReceiver(receiver,intentfilter);
上面是判断蓝牙是否开启,其中还在intent中取出字段来判定情况.很显然这里还可以判定蓝牙状态关和闭下分别执行对应的业务逻辑.为什么我们不能直接在打开蓝牙之后就去执行相应的任务呢?因为蓝牙打开是耗时的过程,是另外的一个进程执行的业务,很显然是不能直接去进行搜索设备的.如果在ba.enable()之后直接进行搜索,就会卡主,或者没显示.这个时候利用广播去监听就显得很为便利.因为广播实现的过程本身是进程之间Binder通信来完成的.如果本机的蓝牙是开启的话,就直接在前面的ba.isEnable()判断中去执行搜索设备.
3.显示搜索到设备展示出来
搜索设备也是一个耗时的过程,该过程是异步的.在Android手机设备中,系统会有一个广播ACTION_FOUND的意图,一旦设备被搜索到之后,就会发送一个广播,那么在本机中注册一个ACTION_FOUND 的广播的话,就能接收所搜索到设备的消息.如下展示:
BroadcastReceiver btreciever=new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(BluetoothDevice.ACTION_FOUND)){ BluetoothDevice devices = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); arrayAdapter.add(devices.getName()+"\n"+devices.getAddress()); //用列表的形式将设备展现出来 } } };
认识一下这里的BluetoothDevice蓝牙设备,BluetoothDevice其实是一个能够跨进程传递的对象,封装了有关蓝牙设备的若干信息,而且实现了Parcelable接口,从上面的getParcelableExtra()方法中接可以看出来.这里之获取到了设备的名称和地址,也有其他的信息,可以去看一下源码.
4.配对和连接
这里展示作为客户端进行连接.客户端连接蓝牙需要两个步骤,
第一步:调用BluetoothDecives的方法,createRfcommSocketToServiceRecord(MY_UUID)获取一个BluetoothSocket对象;
UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
第二步:然后调用BluetoothSocket的connect()方法,这个方法是一个阻塞的方法.可以利用AsyncTask来实现连接.定制一个ClinetTask()连接任务,将要连接的设备绑定客户端任务即可.
class ClientTask extends AsyncTask<Void, Integer, Integer> { BluetoothDevice bd; BluetoothSocket bs; public ClientTask(BluetoothDevice bd) { this.bd = bd; try { bs = bd.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { e.printStackTrace(); } } @Override protected Integer doInBackground(Void... params) { bluetoothAdapter.cancelDiscovery(); // 停止搜索,开始连接热点,如果不停止,容易导致连接失败 try { bs.connect(); //开始连接,这是一个阻塞的方法,这个过程有12秒的时间,可以在此做连接通信 } catch (IOException e) { e.printStackTrace(); } finally { try { bs.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }
连接完成之后,是通过获得流来通信的.分别使用getInputStream和getOutputStream获取输入和输出流处理传输.
- 蓝牙有关的操作
- IOS 有关蓝牙的开发
- 有关蓝牙的小心得
- 有关蓝牙知识的网站收集
- 有关android蓝牙的一些资料连接
- android蓝牙自动配对的有关问题
- 有关Android Bluetooth/蓝牙的介绍
- TreeView的有关操作
- TreeView的有关操作
- TreeView的有关操作
- 有关数据库的操作
- 有关时间的操作
- 有关字符串的操作
- 数据库的有关操作
- 有关bitmap的操作
- 有关flash的操作
- 表的有关操作
- 有关时间的操作
- linux 查看端口号
- 云盘处理大文件
- Linux 下 vi命令使用
- Activity总结,看这个就够了
- 文件加密总结
- 蓝牙有关的操作
- Gson 使用指南(中文)
- 分治算法
- 日常收藏
- VLAN 的认识
- 天使总动员隐私政策
- Java基础知识回顾--正则表达式
- 百度一二面
- runtime