Android 蓝牙开发基本流程之“连接指定水木行蓝牙模块”
根据我们实际项目需求,总结了建立蓝牙连接“指定水木行蓝牙模块”的必要四步:1.添加权限并判断设备是否支持蓝牙;2.打开蓝牙;3.连接设备;4.设备间数据交换。
一、首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限
/**
*在AndroidManifest中配置权限
*/
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 在android 6.0 以后,要想获得蓝牙扫描结果,还需要下面的权限-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
二、判断设备是否支持蓝牙,如果支持打开蓝牙
private static final int ENABLE_BLUETOOTH = 1; //打开蓝牙
/**
* 初始化蓝牙,并判断蓝牙
*/
private void initBluetooth() {
//获取本机BluetoothAdapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
// 另一种获取获取本机BluetoothAdapter的方法
// BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 检查设备上是否支持蓝牙设备
if (bluetoothAdapter == null) {
Log.d(TAG, "Device does not support Bluetooth");
Toast.makeText(LoginActivity.this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show();
// 不支持蓝牙设备,木法,巧妇难为无米之炊,退出!
finish();
return;
}
//使用inEnabled方法确认设备 蓝牙是否开启
if (!bluetoothAdapter.isEnabled()) {
//打开蓝牙,会提示用户 ; 接下去,在onActivityResult回调判断
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, ENABLE_BLUETOOTH);
}
}
/**
*回调判断
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ENABLE_BLUETOOTH) { //打开蓝牙
if (resultCode == RESULT_OK) {
//打开蓝牙后的一系列操作
} else {
Toast.makeText(LoginActivity.this, "You must turn on Bluetooth", Toast.LENGTH_SHORT).show();
finish();
}
}
}
三 、连接蓝牙
/**
* 准备连接蓝牙
*/
private void goConnectBluetooth() {
//蓝牙连接是费时操作,所以要单起一个线程
new Thread() {
public void run() {
//获取BluetoothAdapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
//连接默认的水木行蓝牙串口设备
BluetoothDevice device = bluetoothAdapter.getRemoteDevice("20:17:10:24:44:16");
//蓝牙连接并通信
connect(device);
}
;
}.start();
}
四、蓝牙通信:设备间数据交换
private BluetoothSocket socket = null;
/**
* 蓝牙连接并通信
*
* @param device
*/
protected void connect(BluetoothDevice device) {
try {
// Create a Socket connection: need the server's UUID number ofregistered
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.connect();
//蓝牙是否成功连接
boolean isConnect = socket.isConnected();
//获取蓝牙通信的输入输出流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
while (true) { //保证socket一直连接
//读取服务端发来的信息
readDataFromServer();
}
} catch (IOException e) {
Log.e("EF-BTBee", ">>", e);
ToastUtil.showToast(BluetoothClientActivity.this, "Socket connection failed");
finish();
return;
} finally {
if (socket != null) {
try {
socket.close();
//finish();
return;
} catch (IOException e) {
}
}
}
}
/**
*读取服务端发来的信息
*/
private void readDataFromServer() {
final byte[] bytes = new byte[1024];
try {
int cnt = inputStream.read(bytes);
String s = new String(bytes, 0, cnt);
if (!StringUtils.isEmpty(s)) {
//把读取到的信息用handler处理,改变界面显示
Message msg = handler.obtainMessage();
msg.what = 0;
msg.obj = s;
handler.sendMessage(msg);
}
} catch (Exception e) {
ToastUtil.showToast(BluetoothClientActivity.this, "socket error");
e.printStackTrace();
}
}
/**
*发送指令到服务端
*/
private void sentMessage(String message) {
if (!StringUtils.isEmpty(message)) {
Log.d(TAG, "发送信息To服务器: " + message);
try {
byte[] bytes = message.getBytes();
outputStream.write(bytes);
outputStream.flush();
} catch (IOException e) {
ToastUtil.showToast(BluetoothClientActivity.this, "socket error");
e.printStackTrace();
}
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//获取服务端发来的信息
String result = (String) msg.obj;
//然后自行处理
Log.d(TAG, "result:"+result);
break;
}
}
};