|
发表于 2008-6-15
|
|阅读模式
开启 mAcceptThread 线程 蓝牙4% Z) j4 V( g: u# {& u ~+ L
1 i ~' W& h( W c5 E# O
" x7 p. |7 |1 p: [! ~/ t$ N% _ ' c8 |( v- H2 {5 f, w
开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
2 \. A+ h4 r1 J3 m6 Z, n& E( V* z( A, ?9 Q: u
public synchronized void connect(BluetoothDevice device) :" G$ _9 u' W/ W0 i
! {1 d$ ~8 b% ]/ P2 y! S8 l
取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。2 c8 P3 G' N6 ^: ^ k+ C
; O! @+ B; [- r9 A5 l7 w1 X, M public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :
) n4 e6 `: ?" }( P! \
. y$ ^( @; T1 {0 d0 q 开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新 mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler 来通知 UI 连接 OK 。: W: U" n5 w6 d
- e5 A9 B M7 M) N4 o' b h) X. u
public synchronized void stop() :5 v; S8 t! t* b3 Q6 t
0 H: D4 a, g5 g" J 停止所有相关线程,设当前状态为 NONE 。2 @8 E$ P' O8 e1 U6 w3 S! C) n8 d/ `
9 z+ M, J7 p* @: _4 Z
public void write(byte〔〕 out) :7 X1 M9 e- }3 x2 Y- h0 e$ z+ b
1 M9 b Z" I( S) k. | 在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。# g" G9 [7 _1 w8 G3 a) H
( N# o( d! {7 b
private void connectionFailed() :- y! E8 S6 E" d- E2 j3 T1 x- ]
' m. T% w9 W6 c( q0 a0 F 连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
: l; d9 i& ^# ?' ^3 _2 O9 ~& }) `' E; c" G
private void connectionLost() :: J7 v$ M; s1 ^# d* L6 _: S0 `
. F; s- q9 }. b- q6 c 当连接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。
- R$ F4 s( o0 Q& \+ l3 A8 p" O, M- M: B
内部类:
& z2 g- U% G* p4 W; k" ^: k6 I" U! u% d% @" ~1 j2 [/ G
private class AcceptThread extends Thread :0 J( `* q( f' {2 B8 }
4 j% h% ~! Z' `) q5 y6 m
创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。( a" [1 O. N: X$ U% D) ]1 m2 d
+ c9 \$ Z1 D) y- Q private class ConnectThread extends Thread :
, X! [1 [$ n' W7 X5 k/ _9 u8 X& x! D+ G4 `; B$ a/ B
这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。2 m4 [; z3 U) O
. I- D6 y7 T* A0 W' n1 H
private class ConnectedThread extends Thread :' {# m8 i1 t5 b7 C* Q
/ g- G( a5 m/ p* ]: s 这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到 UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。2 l9 [) F& P8 o( K
* ^. W. d" F% R- f6 j' G# z, T
3.4. DeviceListActivity.java) U9 L+ `4 ]3 z9 n8 }9 k
9 o6 ~' o$ r0 I) I1 D2 { 该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。7 ~' F8 F, E. E# F; `) f3 F
7 z P/ E$ H7 C2 k( P0 I5 k
除了 RFCOMM 通信外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。 |
|