安卓实现蓝牙聊天
1.要在安卓使用蓝牙功能,首先需要在AndroidManifest.xml中申请权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
2.关键代码块
2.1DeviceList:
这个主要是用来进行蓝牙的搜索功能
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(device.getBondState() != BluetoothDevice.BOND_BONDED){
mNewDevicesArrayAdapter.add(device.getName()+"\n" +
device.getAddress());
}
}else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)){
progressBar.setVisibility(View.GONE);
Toast.makeText(DeviceList.this,"搜索完毕",Toast.LENGTH_SHORT).show();
if(mNewDevicesArrayAdapter.getCount()==0){
String noDevices=getResources().getText(
R.string.none_found).toString();
mNewDevicesArrayAdapter.add(noDevices);
}
}
}
};
2.2 ChatService
这个是实现蓝牙的连接功能,由于代码过长我在此只展示一下在蓝牙连接了之后所运行的线程的实现代码
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=mmSocket.getInputStream();
tmpOut=mmSocket.getOutputStream();
}catch (IOException e){}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run(){
byte[]buffer=new byte[1024];
int bytes;
while (true){
try{
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(MainActivity.MESSAGE_READ,bytes,-1,buffer).sendToTarget();
}catch (IOException e){
connectionLost();
break;
}
}
}
public void write(byte[]buffer){
try{
mmOutStream.write(buffer);
}catch (IOException e){
Log.d("MainActivity","Send Fail");
}
mHandler.obtainMessage(MainActivity.MESSAGE_WRITE,buffer).sendToTarget();
}
public void cancel(){
try{
mmSocket.close();
}catch (IOException e){}
}
}
2.3 MainActivity
这里的代码是专门服务于在蓝牙连接之后的通信的
下面是主要代码:
private final Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg){
switch (msg.what){
case MESSAGE_STATE_CHANGE:
switch (msg.arg1){
case ChatService.STATE_CONNECTED:
mConversationArrayAdapter.clear();
break;
case ChatService.STATE_CONNECTING:
break;
case ChatService.STATE_LISTEN:
case ChatService.STATE_NONE:
break;
}break;
case MESSAGE_WRITE:
byte[]writeBuf =(byte[])msg.obj;
String writeMessage=new String(writeBuf);
mConversationArrayAdapter.add("我: " + writeMessage);
break;
case MESSAGE_READ:
byte[]readBuf =(byte[])msg.obj;
String readMessage=new String(readBuf,0,msg.arg1);
mConversationArrayAdapter.add(mConnectedDeviceName+": "
+readMessage);
break;
case MESSAGE_DEVICE_NAME:
mConnectedDeviceName=msg.getData().getString(DEVICE_NAME);
Toast.makeText(getApplicationContext(),
"链接到"+mConnectedDeviceName,Toast.LENGTH_SHORT)
.show();
break;
case MESSAGE_TOAST:
Toast.makeText(getApplicationContext(),
msg.getData().getString(TOAST),Toast.LENGTH_SHORT)
.show();
break;
}
}
};
结语
这一次的作业我感觉挺难的,在写的时候我也出现了许多的问题,而且有一些问题一直到现在还没有解决,我在写代码的时候也参考了网上的许多的教程,之前从来没有接触过网络通信这一块的知识,所以写得十分之慢。在这一次的作业里面我也知道了自己还存在许多的不足。希望在以后可以在这个方面走远一点!