小弟对线程方面掌握的不怎么样,蓝牙通信这块查了好多资料,自己还是做不出来  我觉得应该是匹配蓝牙以后 连接方面出问题了,求解答
代码如下public class Main extends Activity implements OnClickListener,
OnItemClickListener {
private BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
private Button bn_on, bn_off, bn_ss, bn_kg, bn_send;
private ListView lv;
private EditText edtmsg;
private List<String> bluetoothDevices = new ArrayList<String>();
private ArrayAdapter<String> arrayAdapter;
private BluetoothChat bluetoothchat;
private final UUID MY_UUID = UUID
.fromString("69bbe226-e6ba-4568-983a-50e90ba44cbd");
private final String NAME = "Bluetooth_Socket";
private BluetoothSocket clientSocket;
private OutputStream os; private String address; public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";
public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";
public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";
public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex"; private BluetoothServerSocket mserverSocket = null;
private ServerThread startServerThread = null;// 开启服务线程
private clientThread clientConnectThread = null;// 客户端连接线程
private BluetoothSocket socket = null;
private BluetoothDevice device = null;
private readThread mreadThread = null;// 读取数据线程 @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.masin);
bn_on = (Button) findViewById(R.id.bn_on);
bn_off = (Button) findViewById(R.id.bn_off);
bn_ss = (Button) findViewById(R.id.bn_ss);
lv = (ListView) findViewById(R.id.lv);
bn_kg = (Button) findViewById(R.id.bn_kg);
bn_send = (Button) findViewById(R.id.bn_send);
edtmsg = (EditText) findViewById(R.id.edtmsg);
bn_on.setOnClickListener(this);
bn_kg.setOnClickListener(this);
bn_off.setOnClickListener(this);
bn_ss.setOnClickListener(this);
bn_send.setOnClickListener(this); Set<BluetoothDevice> pairedDevices = ba.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
bluetoothDevices.add(device.getName() + "\n"
+ device.getAddress());
} }
arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1,
bluetoothDevices); lv.setAdapter(arrayAdapter); // 注册用于接受已搜索到的蓝牙设备的Receiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(receiver, filter);
// 注册搜索完成时的蓝牙设备的Receiver
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(receiver, filter);
lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String s = arrayAdapter.getItem(position);
String address = s.substring(s.indexOf(":") + 1).trim();
// Toast.makeText(getBaseContext(), s, 1000).show();
try {
if (ba.isDiscovering()) {
ba.cancelDiscovery();
} try { if (device == null) {
device = ba.getRemoteDevice(address);
} if (clientSocket == null) {
clientSocket = device
.createRfcommSocketToServiceRecord(MY_UUID);
clientSocket.connect();
os = clientSocket.getOutputStream();
} } catch (IOException e) { }
if (os != null) { os.write("发送信息到其他蓝牙设备.".getBytes("utf-8")); Toast.makeText(getBaseContext(), "信息发送成功.",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getBaseContext(), "信息发送失败.",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),
Toast.LENGTH_LONG).show(); }
}
});
// bluetoothchat = new BluetoothChat(this);
// bluetoothchat.CreatePortListen();
startServerThread = new ServerThread();
startServerThread.start(); } public void onClick(View v) {
switch (v.getId()) { // 打开蓝牙
case R.id.bn_on:
Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(i, 1);
break; // 关闭蓝牙
case R.id.bn_off: ba.disable();
break;
// 搜索
case R.id.bn_ss:
edtmsg.setText("");
setProgressBarIndeterminateVisibility(true);
setTitle("正在扫描");
// 如果现在正在搜索,先取消搜索
if (ba.isDiscovering()) {
ba.cancelDiscovery();
}
ba.startDiscovery();
break; // 打开可见性
case R.id.bn_kg:
if (!ba.isEnabled()) {
Toast.makeText(getApplicationContext(), "请先打开蓝牙设备",
Toast.LENGTH_SHORT).show();
return;
}
Intent in = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
in.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 120);
startActivity(in);
break;
// 发送消息并清空edit
case R.id.bn_send:
// bluetoothchat.SendData(edtmsg.getText().toString());
// edtmsg.setText("");
break;
}
} private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
// 获得已搜索到的蓝牙设备
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 搜索到的设备不是已绑定的蓝牙设备
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
bluetoothDevices.add(device.getName() + ":"
+ device.getAddress() + "\n");
arrayAdapter.notifyDataSetChanged();
}
// 搜索完成
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)) {
setProgressBarIndeterminateVisibility(false);
setTitle("搜索蓝牙设备");
} }
};
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String s = arrayAdapter.getItem(position);
address = s.substring(s.indexOf(":") + 1).trim(); clientConnectThread = new clientThread();
clientConnectThread.start();
try {
if (ba.isDiscovering()) {
System.out.println("ba.isDiscovering");
ba.cancelDiscovery();
} if (device == null) {
System.out.println("device=null&&");
device = ba.getRemoteDevice(address);

} sendMessageHandle("测试消息!!!!");
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } } /**
 * *=======================================================================
 * =================================================================
 */
private Handler LinkDetectedHandler = new Handler() {
@Override
public void handleMessage(Message msg) { switch (msg.what) {

case 0:
Toast.makeText(Main.this, String.valueOf(msg.obj),
Toast.LENGTH_LONG).show();
break;
case 1:
System.out.println("handlermsg" + msg.obj);
Toast.makeText(Main.this, String.valueOf(msg.obj),
Toast.LENGTH_LONG).show();
break; }
} }; // 开启服务器
private class ServerThread extends Thread {
public void run() {
try {
/*
 * 创建一个蓝牙服务器 参数分别:服务器名称、UUID
 */
mserverSocket = ba
.listenUsingRfcommWithServiceRecord(
PROTOCOL_SCHEME_RFCOMM,
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Log.d("server", "wait cilent connect..."); /* 接受客户端的连接请求 */
socket = mserverSocket.accept();
Log.d("server", "accept success !"); // 启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}; // 开启客户端
private class clientThread extends Thread {
public void run() {
try {
// 创建一个Socket连接:只需要服务器在注册时的UUID号
// socket =
// device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
socket = device.createRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
// 连接
socket.connect();
// 启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch (IOException e) {
Log.e("connect", "", e);
Message msg = new Message();
msg.obj = "连接服务端异常!断开连接重新试一试。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
}
}
}; // 发送数据
private void sendMessageHandle(String msg) {
if (socket == null) {
Toast.makeText(getBaseContext(), "没有连接", Toast.LENGTH_SHORT).show();
return;
}
try {
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 读取数据
private class readThread extends Thread {
public void run() { byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null; try {
mmInStream = socket.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true) {
try {
// Read from the InputStream
if ((bytes = mmInStream.read(buffer)) > 0) {
byte[] buf_data = new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = new Message();
msg.obj = s;
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
}
} catch (IOException e) {
try {
mmInStream.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
}
}
}
}}