编程回忆之Android回忆(蓝牙BluetoothAdapter的搜索和连接)
来源:互联网 发布:center os 安装软件 编辑:程序博客网 时间:2024/05/04 12:46
Android的搜索和连接
近期项目设计到一个蓝牙打印机的模块,故查阅了相关资料,发现蓝牙连接和传输的方式跟socket其实很像,设置在蓝牙服务端的设计跟socket服务器端的设计更是相像,只是简单很多而已。下面通过代码简单介绍一下蓝牙搜索和连接。
一、蓝牙权限的配置
在AndroidManifest.xml中配置蓝牙的权限,加上以下两行代码
<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
二、配置本机的蓝牙模块
在配置蓝牙模块时,我们首先要对蓝牙模块的一个核心类BluetoothAdapter有深刻的了解。
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); //直接打开系统的蓝牙设置面板 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
三、蓝牙的搜索
在进行蓝牙搜索开发的时候,我们应该首先了解Android的广播机制,在搜索时使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备,startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。
请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:ACTION_DISCOVERY_START:开始搜索
ACTION_DISCOVERY_FINISHED:搜索结束
ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXTRA_CLASS,分别包含BluetooDevice和BluetoothClass。
我们通过自己配置广播接收器来实现Android蓝牙的搜索
// 设置广播信息过滤 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // 注册广播接收器,接收并处理搜索结果 context.registerReceiver(receiver, intentFilter);
/** * 蓝牙广播接收器 */ private BroadcastReceiver receiver = new BroadcastReceiver() { ProgressDialog progressDialog = null; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() == BluetoothDevice.BOND_BONDED) { addBandDevices(device); } else { addUnbondDevices(device); } } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { progressDialog = ProgressDialog.show(context, "请稍等...", "搜索蓝牙设备中...", true); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action)) { System.out.println("设备搜索完毕"); progressDialog.dismiss(); addUnbondDevicesToListView(); addBondDevicesToListView(); // bluetoothAdapter.cancelDiscovery(); } if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { if (bluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) { System.out.println("--------打开蓝牙-----------"); searchDevices.setEnabled(true); bondDevicesListView.setEnabled(true); unbondDevicesListView.setEnabled(true); } else if (bluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF) { System.out.println("--------关闭蓝牙-----------"); searchDevices.setEnabled(false); bondDevicesListView.setEnabled(false); unbondDevicesListView.setEnabled(false); } } } };
四、蓝牙的连接
如果打算建议两个蓝牙设备之间的连接,则必须实现服务器端与客户端的机制。当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。
服务器设备与客户端设备获取BluetoothSocket的途径是不同的。服务器设备是通过accepted一个incoming connection来获取的,而客户端设备则是通过打开一个到服务器的RFCOMM channel来获取的。
/** * 连接蓝牙设备 */public boolean connect() {if (!this.isConnection) {try {boolean isOldVersion = false;if (Build.VERSION.SDK_INT < 15) {isOldVersion = true;}// 兼容旧版本if (isOldVersion) {bluetoothSocket = this.device.createRfcommSocketToServiceRecord(uuid);} else {bluetoothSocket = this.device.createInsecureRfcommSocketToServiceRecord(uuid);}bluetoothSocket.connect();outputStream = bluetoothSocket.getOutputStream();this.isConnection = true;if(isConnection){PRT=new PRTAndroidPrint(outputStream);}if (this.bluetoothAdapter.isDiscovering()) {System.out.println("关闭适配器!");this.bluetoothAdapter.isDiscovering();}} catch (Exception e) {Toast.makeText(this.context, "连接失败!", 1).show();return false;}Toast.makeText(this.context, this.device.getName() + "连接成功!",Toast.LENGTH_SHORT).show();return true;} else {return true;}}
五、蓝牙的断开
使用蓝牙后记得关闭蓝牙连接,释放内存。
/** * 断开蓝牙设备连接 */public static void disconnect() {System.out.println("断开蓝牙设备连接");try {if(bluetoothSocket!=null){bluetoothSocket.close();}if(outputStream!=null){outputStream.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
0 0
- 编程回忆之Android回忆(蓝牙BluetoothAdapter的搜索和连接)
- 编程回忆之Android回忆(Android 连接到webservice)
- 编程回忆之java回忆(与mysql的连接)
- 编程回忆之Android回忆(背景的平铺)
- 编程回忆之Android回忆(selector的用法)
- 编程回忆之Android回忆(AnimationDrawable的使用)
- 编程回忆之Android回忆(AIDL的使用)
- 编程回忆之Android回忆(Android标题栏的去除和全屏)
- 编程回忆之Android回忆(Android Socket编程)
- 编程回忆之Android回忆(Android 调用短信服务)
- 编程回忆之Android回忆(Android权限大全)
- 编程回忆之Android回忆(巧用dimens适配多个分辨率)
- 编程回忆之Android回忆(创建导航抽屉)
- 编程回忆之Android回忆(个性化控件(View)篇)
- 编程回忆之运维回忆(细节的作用)
- 编程回忆之Android回忆(Android的强制横屏,竖屏,长亮)
- 编程回忆之Android回忆(Android获取res目录下的资源)
- 编程回忆之Android回忆(Android应用参数的获取)
- oracle导入数据时出现字段过长
- ORACLE 忘记数据库密码
- UVa 10494 - If We Were a Child Again
- Oracle的锁表与解锁
- 设置ORACLE客户端字符集
- 编程回忆之Android回忆(蓝牙BluetoothAdapter的搜索和连接)
- 有关 ORA-00604 错误的总结
- 【DBA之路】关于连接不上数据库
- ORACLE配置非默认位置的监听程序
- 问题解决方法
- 将博客搬至CSDN
- Hibernate 一对多级联删除
- [Hadoop源码解读](二)MapReduce篇之Mapper类
- android base64 编码