- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
Android 蓝牙通信开发教程(详解版)
Android 系统提供蓝牙 API 包 android.bluetooth,允许手机设备通过蓝牙与其他设备进行无线连接。
Android 的蓝牙 API 可提供以下功能:
- 查找并配对蓝牙设备。
- 建立 RFCOMM 通道。
- 通过服务发现(Device Discovery)与其他无线设备进行连接。
- 与其他设备进行蓝牙数据传输。
- 管理多个蓝牙连接。
需要说明的是,Android 模拟器不支持蓝牙功能,因此蓝牙相关的应用程序只能在真机上调试。
要使用蓝牙功能,需要在 AndroidManifest.xml 中声明相应权限。蓝牙权限有两种,分别为:
<uses-permission android:name="android.permission.BLUETOOTH" />
或者:
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
如果想在应用程序中请求或者建立蓝牙连接并传递数据,必须声明 Bluetooth 权限。若想初始化设备发现功能或者对蓝牙设置进行更改,则必须声明 BLUETOOTH_ADMIN 权限。
要在应用程序中使用蓝牙功能,必须保证当前设备具有蓝牙并且启用该功能。若当前设备支持蓝牙,但是没有启用相关功能,则需要人工启用蓝牙功能。
首先使用 BluetoothAdapter 类的对象来确认设备具有蓝牙功能,然后使用 Intent 开启蓝牙功能。相关代码如下:
BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter==null) { //设备不支持蓝牙功能 return; } //设备支持蓝牙功能 if (!mBluetoothAdapter.isEnabled()) { //用于启动蓝牙功能的 Intent Intent enableBtIntent=new Intent (BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult (enableBtIntent, REQUEST_ENABLE_BT); }
startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT) 调用后,会显示如图 1 所示的对话框,要求用户确认是否启用蓝牙功能。
图 1 请求启用蓝牙功能对话框
若用户单击 Yes 按钮,则 Android 系统会启用蓝牙功能。若蓝牙功能启用成功,onActivityResult() 方法会返回 RESULT_OK;若蓝牙功能启用失败或者用户单击 No 按钮,则返回 RESULT_CANCELED。
通过 BluetoothAdapter 类对象可以发现其他的蓝牙设备。在启动设备发现服务前,应该首先对配对设备列表进行查询,以确定要连接的无线设备是否已知。
配对设备列表中存储了以前配对过的蓝牙设备的基本信息,如设备名称、设备类型、设备的 MAC 地址等。通过设备列表查找设备可以节省大量查找时间。查询设备列表的代码如下:
Set<BluetoothDevice> pairedDevices=mBluetoothAdapter.getBondedDevices(); //已配对设备列表存在 if(pairedDevices.size() > 0) { //列表内循环查找 for(BluetoothDevice device : pairedDevices) { //将列表内的设备名字添加到 ArrayAdapter 中 mArrayAdapter.add (device.getName()+"\n"+device.getAddress()); } }
当设备列表中未发现要连接的设备时,需要启动设备发现服务来发现远端蓝牙设备,扫描周围无线设备的时间为 12 秒钟左右。
启动设备发现服务的方法很简单,只要调用 startDiscovery() 方法即可。但是为了接收设备发现服务返回的设备信息,应用程序需要注册用于接收含有 ACTION_FOUND 消息的 Intent 的 BroadcastReceiver。其代码如下:
private final BroadcastReceiver mReceiver=new BroadcastReceiver(){ public void onReceive(Context context,Intent intent){ String action=intent.getAction(); //发现服务发现远端设备时 if (BluetoothDevice.ACTION_FOUND.equals(action)){ //从 Intent 对象中获取 BluetoothDevice 对象信息 BluetoothDevice device=intent.getParcelableExtra (BluetoothDevice.EXTRA_DEVICE); //当发现的新设备不存在于设备配对列表中时,将设备的名字和地址添加到 ArrayAdapter 中 if(device.getBondState()!=BluetoothDevice.BOND_BONDED) { mArrayAdapter.add (device.getName()+"\n"+device.getAddress()) ; } } } }; //注册 BroadcastReceiver IntentFilter filter=new IntentFilter (BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver,filter);
使用 registerReceiver() 方式注册的 BroadcastReceiver,在应用程序结束时要记得注销。
蓝牙设备间建立连接的过程和 TCP 连接的过程很相似。
服务器端提供 BluetoothServerSocket 类在服务器端进行监听,当有客户端连接请求时,用于建立连接;客户端提供 BluetoothSocket 类用于对蓝牙服务提交连接请求,并建立连接。
服务器端处理连接请求的示例代码如下:
private class AcceptThread extends Thread { private final BluetoothServerSocket mmServerSocket; private final String NAME="MY_BLUETOOTH_SERVICE"; public AcceptThread(){ BluetoothServerSocket tmp=null; try { //MY_UUID 用于唯一标识当前的蓝牙服务,在建立连接时会被客户端使用 tmp=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID); } catch (IOException e) { e.printStackTrace() } mmServerSocket=tmp; } public void run(){ BluetoothSocket socket =null; //保持监听状态,并阻塞线程,当连接建立时返回。 while (true) { try { socket=mmServerSocket.accept(); } catch (IOException e) { break; } //连接已经建立 if (socket !=null) { //在单独的线程中对连接进行管理,本线程结束 manageConnectedSocket(socket); mmServerSocket.close(); break; } } } public void cancel(){ try { mmServerSocket.close(); } catch (IOException e) { e.printStackTrace() } } }
UUID(Universally Unique Identifier)为通用唯一识别码,是一个 128 位的字符串,在该处用于唯一标识蓝牙服务。客户端通过 UUID 搜寻到该服务。
客户端用于请求连接的示例代码如下:
private class ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; public ConnectThread (BluetoothDevice device) { BluetoothSocket tmp=null; mmDevice=device; //通过 BluetoothDevice 建立 BluetoothSocket 对象 try { tmp=device.createRfcommSocketToServiceRecord (MY_UUID); } catch (IOException e) { e.printStackTrace(); } mmSocket=tmp; } public void run(){ //发现服务会减慢连接建立速度,因此关闭掉 mBluetoothAdapter.cancelDiscovery(); try { //请求连接,该操作会阻塞线程 mmSocket.connect()/ } catch (IOException connectException) { //建立连接失败 try { mmSocket.close() ; } catch (IOException closeException) { } return; } //连接已建立,在单独的线程中对连接进行管理 manageConnectedSocket (mmSocket) ; } public void cancel (){ try { mmSocket.close(); } catch (IOException e) { } } }
由于连接建立的过程会阻塞进程,属于耗时操作,因此连接的建立和管理都需要在单独的线程中进行。在实际的工程开发过程中,建立蓝牙连接的技巧是将每个蓝牙设备初始化为服务器端并监听连接,这样每个设备都可以自动在服务器端和客户端之间进行转化。
从已经建立的连接中读取和写入数据的过程也属于耗时操作,因此也应该在单独的线程中进行。
通过 getInputStream() 和 getOutputStream() 方法可以获取输入流 InputStream 和输出流 OutputStream,通过 read(byte[]) 和 write(byte[]) 方法可以对数据进行读写。示例代码如下:
private class ConnectedThread extends Thread { private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread (BluetoothSocket socket) { mmSocket=socket; InputStream tmpln=null; OutputStream tmpOut=null; // Get the input and output streams, using temp objects because // member streams are final try { tmpIn=socket.getInputStream(); tmpOut=socket.getOutputStream(); } catch (IOException e) { } mmInStream=tmpIn; mmOutStream=tmpOut; } public void run(){ byte[] buffer=new byte[1024]; //持续监听 InputStream while (true) { try { //读取 InputStream 的数据 bytes=mmInStream.read (buffer); // 更新 UI mHandler.obtainMessage (MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } } public void write (byte[] bytes) { try { mmOutStream.write (bytes); } catch (IOException e) { } } public void cancel (){ try { mmSocket.close(); } catch (IOException e) { } } }
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论