Android蓝牙通信讲解
1. 使用蓝牙的响应权限
1
2
|
<
uses-permission
android:name
=
"android.permission.BLUETOOTH"
/>
<
uses-permission
android:name
=
"android.permission.BLUETOOTH_ADMIN"
/>
|
1
2
3
4
5
6
7
8
9
10
11
|
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
//直接打开系统的蓝牙设置面板
Intent intent =
new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,
0x1
);
//直接打开蓝牙
adapter.enable();
//关闭蓝牙
adapter.disable();
//打开本机的蓝牙发现功能(默认打开120秒,可以将时间最多延长至300秒)
Intent discoveryIntent =
new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
300
);
//设置持续时间(最多300秒)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 创建一个接收ACTION_FOUND广播的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 device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 将设备名称和地址放入array adapter,以便在ListView中显示
mArrayAdapter.add(device.getName() +
"\n"
+ device.getAddress());
}
}
};
// 注册BroadcastReceiver
IntentFilter filter =
new
IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
// 不要忘了之后解除绑定
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
private
class
AcceptThread
extends
Thread {
private
final
BluetoothServerSocket mmServerSocket;
public
AcceptThread() {
// Use a temporary object that is later assigned to mmServerSocket,
// because mmServerSocket is final
BluetoothServerSocket tmp =
null
;
try
{
// MY_UUID is the app's UUID string, also used by the client code
tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
}
catch
(IOException e) { }
mmServerSocket = tmp;
}
public
void
run() {
BluetoothSocket socket =
null
;
// Keep listening until exception occurs or a socket is returned
while
(
true
) {
try
{
socket = mmServerSocket.accept();
}
catch
(IOException e) {
break
;
}
// If a connection was accepted
if
(socket !=
null
) {
// Do work to manage the connection (in a separate thread)
manageConnectedSocket(socket);
mmServerSocket.close();
break
;
}
}
}
/** Will cancel the listening socket, and cause the thread to finish */
public
void
cancel() {
try
{
mmServerSocket.close();
}
catch
(IOException e) { }
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
private
class
ConnectThread
extends
Thread {
private
final
BluetoothSocket mmSocket;
private
final
BluetoothDevice mmDevice;
public
ConnectThread(BluetoothDevice device) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket tmp =
null
;
mmDevice = device;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try
{
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
}
catch
(IOException e) { }
mmSocket = tmp;
}
public
void
run() {
// Cancel discovery because it will slow down the connection
mBluetoothAdapter.cancelDiscovery();
try
{
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
}
catch
(IOException connectException) {
// Unable to connect; close the socket and get out
try
{
mmSocket.close();
}
catch
(IOException closeException) { }
return
;
}
// Do work to manage the connection (in a separate thread)
manageConnectedSocket(mmSocket);
}
/** Will cancel an in-progress connection, and close the socket */
public
void
cancel() {
try
{
mmSocket.close();
}
catch
(IOException e) { }
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
private
class
ConnectedThread
extends
Thread {
private
final
BluetoothSocket mmSocket;
private
final
InputStream mmInStream;
private
final
OutputStream mmOutStream;
public
ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn =
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
];
// buffer store for the stream
int
bytes;
// bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while
(
true
) {
try
{
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -
1
, buffer)
.sendToTarget();
}
catch
(IOException e) {
break
;
}
}
}
/* Call this from the main Activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
/* Call this from the main Activity to shutdown the connection */
public
void
cancel() {
try
{
mmSocket.close();
}
catch
(IOException e) { }
}
}
|