基于蓝牙的安卓客户端开发
一.安卓蓝牙开发基本流程
- 获取本地蓝牙适配器,打开蓝牙,获得已配对蓝牙设备列表
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
mBtAdapter.enable();
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
- 扫描未配对设备,通过广播(BluetoothDevice.ACTION_FOUND)接收列表出未配对的设备
mBtAdapter.startDiscovery();
- 从列表设备选择某个蓝牙进行连接,获得BluetoothDevice 对象
device.getName()
device.getAddress()
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address)
- 开始连接线程,获得BluetoothSocket
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket bluetoothSocket= device.createRfcommSocketToServiceRecord(MY_UUID)
- 开始已连接线程,由BluetoothSocket获得输入输出流从而收发数据
二.权限申明
1 <!--蓝牙权限--> 2 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 3 <uses-permission android:name="android.permission.BLUETOOTH" />
三.布局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:id="@+id/activity_main" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 > 9 <!--标题栏--> 10 <LinearLayout 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:background="#CDC9C9"> 14 <TextView 15 android:id="@+id/DeviceTextView" 16 android:layout_width="wrap_content" 17 android:layout_weight="1" 18 android:layout_height="wrap_content" 19 android:text="设备:" 20 android:textColor="#FFFFFF" 21 android:textSize="20dp" 22 /> 23 <TextView 24 android:id="@+id/StateTextView" 25 android:layout_width="wrap_content" 26 android:layout_weight="1" 27 android:layout_height="wrap_content" 28 android:text="状态:" 29 android:textColor="#FFFFFF" 30 android:textSize="20dp" 31 /> 32 </LinearLayout> 33 <!--聊天界面--> 34 <LinearLayout 35 android:id="@+id/chatPage" 36 android:layout_width="match_parent" 37 android:layout_height="wrap_content" 38 android:orientation="vertical" 39 android:visibility="gone" 40 android:layout_marginLeft="10dp" 41 android:layout_marginRight="10dp" 42 > 43 <LinearLayout 44 android:layout_width="match_parent" 45 android:layout_height="wrap_content" 46 47 > 48 <EditText 49 android:id="@+id/MessageEditText" 50 android:layout_marginTop="5dp" 51 android:layout_width="wrap_content" 52 android:layout_weight="1" 53 android:layout_height="40dp" 54 /> 55 <Button 56 android:id="@+id/SendButton" 57 android:layout_width="wrap_content" 58 android:layout_height="wrap_content" 59 android:layout_marginTop="4dp" 60 android:textAllCaps="false" 61 android:text="Send" 62 /> 63 </LinearLayout> 64 <LinearLayout 65 android:layout_width="match_parent" 66 android:layout_height="wrap_content"> 67 <TextView 68 android:id="@+id/DisplayTextView" 69 android:layout_width="match_parent" 70 android:layout_height="wrap_content" 71 android:hint="DisplayTextView"/> 72 </LinearLayout> 73 74 </LinearLayout> 75 <!--控制界面--> 76 <LinearLayout 77 android:id="@+id/controlPage" 78 android:layout_width="match_parent" 79 android:layout_height="match_parent" 80 android:orientation="vertical" 81 android:visibility="visible"> 82 </LinearLayout> 83 <!--数据中心--> 84 <LinearLayout 85 android:id="@+id/displayPage" 86 android:layout_width="match_parent" 87 android:layout_height="match_parent" 88 android:orientation="vertical" 89 android:visibility="gone"> 90 </LinearLayout> 91 </LinearLayout>
四.具体代码实现
-
MainActivity
1 package com.example.john.esdc; 2 3 import android.app.Activity; 4 import android.bluetooth.BluetoothAdapter; 5 import android.bluetooth.BluetoothDevice; 6 import android.content.Intent; 7 import android.os.Handler; 8 import android.os.Message; 9 import android.support.v7.app.AppCompatActivity; 10 import android.os.Bundle; 11 import android.view.Menu; 12 import android.view.MenuItem; 13 import android.view.View; 14 import android.widget.Button; 15 import android.widget.EditText; 16 import android.widget.TextView; 17 import android.widget.Toast; 18 19 public class MainActivity extends AppCompatActivity { 20 21 // Intent request codes 22 private static final int REQUEST_CONNECT_DEVICE = 1; 23 // Local Bluetooth adapter 24 private BluetoothAdapter mBluetoothAdapter = null; 25 // Member object for the chat services 26 private BluetoothChatService mChatService = null; 27 // Message types sent from the BluetoothChatService Handler 28 public static final int MESSAGE_STATE_CHANGE = 1; 29 public static final int MESSAGE_READ = 2; 30 public static final int MESSAGE_WRITE = 3; 31 public static final int MESSAGE_DEVICE_NAME = 4; 32 public static final int MESSAGE_TOAST = 5; 33 // Key names received from the BluetoothChatService Handler 34 public static final String DEVICE_NAME = "device_name"; 35 public static final String TOAST = "toast"; 36 // Name of the connected device 37 private String mConnectedDeviceName = null; 38 //控件 39 TextView deviceTextView; 40 TextView stateTextView; 41 EditText messageEditText; 42 Button sendButton; 43 TextView displayTextView; 44 private int numofMessage=0; //显示的消息数 45 //界面 46 View controlPage; 47 View displayPage; 48 View chatPage; 49 50 51 @Override 52 protected void onCreate(Bundle savedInstanceState) { 53 super.onCreate(savedInstanceState); 54 setContentView(R.layout.activity_main); 55 getWidget(); 56 // Initialize the BluetoothChatService to perform bluetooth connections 57 mChatService = new BluetoothChatService(this, mHandler); 58 // Get local Bluetooth adapter 59 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 60 sendButton.setOnClickListener(new View.OnClickListener() { 61 @Override 62 public void onClick(View v) { 63 String message = messageEditText.getText().toString(); 64 sendMessage(message); 65 } 66 }); 67 } 68 //获取控件对象 69 private void getWidget(){ 70 deviceTextView = (TextView)findViewById(R.id.DeviceTextView); 71 stateTextView = (TextView)findViewById(R.id.StateTextView); 72 messageEditText = (EditText)findViewById(R.id.MessageEditText); 73 sendButton = (Button)findViewById(R.id.SendButton); 74 displayTextView = (TextView)findViewById(R.id.DisplayTextView); 75 76 chatPage = (View)findViewById(R.id.chatPage); 77 controlPage = (View)findViewById(R.id.controlPage); 78 displayPage = (View)findViewById(R.id.displayPage); 79 } 80 //发送一条消息 81 private void sendMessage(String message){ 82 if (mChatService.getState()!=BluetoothChatService.STATE_CONNECTED){ 83 Toast.makeText(this, "未连接蓝牙设备", Toast.LENGTH_SHORT).show(); 84 return; 85 } 86 if (message.length()>0){ 87 byte[] send = message.getBytes(); 88 mChatService.write(send); 89 messageEditText.setText(""); 90 } 91 } 92 //********************************************************************************* 93 //建立菜单 94 @Override 95 public boolean onCreateOptionsMenu(Menu menu) { 96 getMenuInflater().inflate(R.menu.option_menu,menu); 97 return true; 98 } 99 //菜单响应事件,主要完成界面切换 100 @Override 101 public boolean onOptionsItemSelected(MenuItem item) { 102 switch (item.getItemId()){ 103 case R.id.scan: //点击“Scan”项,执行DeviceListActivity,在onActivityResult中返回用户点击连接的蓝牙MAC地址 104 Intent serverIntent = new Intent(this,DeviceListActivity.class); 105 startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE); 106 return true; 107 case R.id.chatPage: 108 chatPage.setVisibility(View.VISIBLE); 109 displayPage.setVisibility(View.GONE); 110 controlPage.setVisibility(View.GONE); 111 return true; 112 case R.id.displayPage: 113 chatPage.setVisibility(View.GONE); 114 displayPage.setVisibility(View.VISIBLE); 115 controlPage.setVisibility(View.GONE); 116 return true; 117 case R.id.controlPage: 118 chatPage.setVisibility(View.GONE); 119 displayPage.setVisibility(View.GONE); 120 controlPage.setVisibility(View.VISIBLE); 121 return true; 122 } 123 return false; 124 } 125 //********************************************************************************************** 126 //获得DeviceList活动反馈回的蓝牙设备地址,获取BluetoothDevice,开始连接 127 @Override 128 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 129 switch (requestCode){ 130 case REQUEST_CONNECT_DEVICE: 131 //获取蓝牙地址并执行连接 132 if(resultCode== Activity.RESULT_OK){ 133 String address = data.getExtras() 134 .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); 135 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 136 mChatService.connect(device); 137 138 } 139 } 140 } 141 //********************************************************************************************** 142 //主要负责更新UI 143 private final Handler mHandler = new Handler(){ 144 @Override 145 public void handleMessage(Message msg) { 146 147 switch (msg.what){ 148 case MESSAGE_STATE_CHANGE: 149 switch (msg.arg1){ 150 case BluetoothChatService.STATE_CONNECTED: 151 stateTextView.setText("状态:已连接"); 152 break; 153 case BluetoothChatService.STATE_CONNECTING: 154 stateTextView.setText("状态:正连接"); 155 break; 156 case BluetoothChatService.STATE_NONE: 157 stateTextView.setText("状态:未连接"); 158 break; 159 } 160 break; 161 case MESSAGE_TOAST: 162 Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST), 163 Toast.LENGTH_SHORT).show(); 164 break; 165 case MESSAGE_DEVICE_NAME: 166 mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); 167 deviceTextView.setText("设备:"+mConnectedDeviceName); 168 Toast.makeText(MainActivity.this, "已连接上"+mConnectedDeviceName, Toast.LENGTH_SHORT).show(); 169 break; 170 case MESSAGE_READ: 171 if (chatPage.getVisibility() == View.VISIBLE){ 172 displayTextView.append(mConnectedDeviceName+":"+msg.obj+"\n"); 173 numofMessage++; 174 if (numofMessage==10) { 175 displayTextView.setText(""); 176 numofMessage = 0; 177 } 178 } 179 break; 180 case MESSAGE_WRITE: 181 byte[] writeBuf = (byte[]) msg.obj; 182 String writeMessage = new String(writeBuf); 183 if (chatPage.getVisibility() == View.VISIBLE){ 184 displayTextView.append("本机:"+writeMessage+"\n"); 185 numofMessage++; 186 if (numofMessage==10) { 187 displayTextView.setText(""); 188 numofMessage = 0; 189 } 190 } 191 break; 192 } 193 } 194 }; 195 }
-
DeviceListActivity
1 package com.example.john.esdc; 2 import android.annotation.SuppressLint; 3 import android.app.Activity; 4 import android.bluetooth.BluetoothAdapter; 5 import android.bluetooth.BluetoothDevice; 6 import android.content.BroadcastReceiver; 7 import android.content.Context; 8 import android.content.Intent; 9 import android.content.IntentFilter; 10 import android.support.v7.app.AppCompatActivity; 11 import android.os.Bundle; 12 import android.view.View; 13 import android.view.Window; 14 import android.widget.AdapterView; 15 import android.widget.ArrayAdapter; 16 import android.widget.ListView; 17 import android.widget.TextView; 18 import android.widget.Toast; 19 20 import java.util.Set; 21 22 import static android.R.attr.filter; 23 @SuppressLint("NewApi") 24 public class DeviceListActivity extends AppCompatActivity { 25 26 // Return Intent extra 27 public static String EXTRA_DEVICE_ADDRESS = "device_address"; 28 29 // Member fields 30 private BluetoothAdapter mBtAdapter; 31 private ArrayAdapter<String> mPairedDevicesArrayAdapter; 32 private ArrayAdapter<String> mNewDevicesArrayAdapter; 33 34 @Override 35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 setContentView(R.layout.activity_device_list); 38 setResult(Activity.RESULT_CANCELED); 39 // 获取本地蓝牙适配器 40 mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 41 mBtAdapter.enable(); //打开蓝牙 42 doDiscovery(); //开始搜索蓝牙设备 43 44 45 //ListView控件适配器组装 46 mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 47 mNewDevicesArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 48 ListView pairedListView = (ListView)findViewById(R.id.paired_devices); 49 pairedListView.setAdapter(mPairedDevicesArrayAdapter); 50 pairedListView.setOnItemClickListener(mDeviceClickListener1); 51 ListView newDevicesListView = (ListView)findViewById(R.id.new_devices); 52 newDevicesListView.setAdapter(mNewDevicesArrayAdapter); 53 newDevicesListView.setOnItemClickListener(mDeviceClickListener2); 54 55 //注册广播 56 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 57 this.registerReceiver(mReceive,filter); 58 filter = new IntentFilter((BluetoothAdapter.ACTION_DISCOVERY_FINISHED)); 59 this.registerReceiver(mReceive,filter); 60 61 //获得已配对的蓝牙设备 62 Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); 63 if (pairedDevices.size()>0) { 64 for (BluetoothDevice device : pairedDevices) { 65 mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 66 } 67 } 68 else{ 69 mPairedDevicesArrayAdapter.add("无已配对设备"); 70 } 71 72 } 73 74 //蓝牙设备列表的点击响应 75 private AdapterView.OnItemClickListener mDeviceClickListener1 = new AdapterView.OnItemClickListener() { 76 @Override 77 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 78 mBtAdapter.cancelDiscovery(); 79 //获取蓝牙设备的MAC地址返回到主活动 80 String info = mPairedDevicesArrayAdapter.getItem(position); 81 String address = info.substring(info.length()-17); 82 Intent intent = new Intent(); 83 intent.putExtra(EXTRA_DEVICE_ADDRESS,address); 84 setResult(Activity.RESULT_OK,intent); 85 finish(); 86 87 88 89 } 90 }; 91 private AdapterView.OnItemClickListener mDeviceClickListener2 = new AdapterView.OnItemClickListener() { 92 @Override 93 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 94 mBtAdapter.cancelDiscovery(); 95 //获取蓝牙设备的MAC地址返回到主活动 96 String info = mNewDevicesArrayAdapter.getItem(position); 97 String address = info.substring(info.length()-17); 98 //Toast.makeText(DeviceListActivity.this, address, Toast.LENGTH_SHORT).show(); 99 Intent intent = new Intent(); 100 intent.putExtra(EXTRA_DEVICE_ADDRESS,address); 101 setResult(Activity.RESULT_OK,intent); 102 finish(); 103 104 105 106 } 107 }; 108 109 private void doDiscovery(){ 110 setTitle("扫描中,请稍等……"); 111 if (mBtAdapter.isDiscovering()){ 112 mBtAdapter.cancelDiscovery(); 113 } 114 mBtAdapter.startDiscovery(); 115 } 116 117 118 @Override 119 protected void onDestroy() { 120 super.onDestroy(); 121 // Make sure we're not doing discovery anymore 122 if (mBtAdapter != null) { 123 mBtAdapter.cancelDiscovery(); 124 } 125 // Unregister broadcast listeners 126 this.unregisterReceiver(mReceive); 127 } 128 //广播监听,当发现新设备时将其添加至列表 129 private final BroadcastReceiver mReceive = new BroadcastReceiver() { 130 @Override 131 public void onReceive(Context context, Intent intent) { 132 String action = intent.getAction(); 133 if(BluetoothDevice.ACTION_FOUND.equals(action)){ 134 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 135 if (device.getBondState()!=BluetoothDevice.BOND_BONDED){ 136 mNewDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress()); 137 } 138 }else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 139 setTitle("请点击设备进行连接:"); 140 if(mNewDevicesArrayAdapter.getCount() == 0){ 141 mNewDevicesArrayAdapter.add("没有搜索到新设备"); 142 } 143 } 144 145 } 146 }; 147 }
-
BluetoothChatService
1 package com.example.john.esdc; 2 3 import android.annotation.SuppressLint; 4 import android.app.Notification; 5 import android.bluetooth.BluetoothAdapter; 6 import android.bluetooth.BluetoothDevice; 7 import android.bluetooth.BluetoothSocket; 8 import android.content.Context; 9 import android.os.Bundle; 10 import android.os.Handler; 11 import android.os.Message; 12 import android.util.Log; 13 import android.widget.Toast; 14 15 import java.io.BufferedReader; 16 import java.io.IOException; 17 import java.io.InputStream; 18 import java.io.InputStreamReader; 19 import java.io.OutputStream; 20 import java.util.UUID; 21 22 /** 23 * Created by john on 2017/2/21. 24 */ 25 26 @SuppressLint("NewApi") 27 public class BluetoothChatService { 28 29 // Unique UUID for this application 30 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 31 // Member fields 32 private final BluetoothAdapter mAdapter; 33 private final Handler mHandler; 34 private int mState; 35 private ConnectThread mConnectThread; 36 private ConnectedThread mConnectedThread; 37 private OutputStream mmOutStream=null; 38 39 // Constants that indicate the current connection state 40 public static final int STATE_NONE = 0; // we're doing nothing 41 public static final int STATE_LISTEN = 1; // now listening for incoming connections 42 public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection 43 public static final int STATE_CONNECTED = 3; // now connected to a remote device 44 45 //构造函数 46 public BluetoothChatService(Context context,Handler handler){ 47 mAdapter = BluetoothAdapter.getDefaultAdapter(); 48 mState = STATE_NONE; 49 mHandler = handler; 50 } 51 //设置蓝牙状态并且通过Hander通知UI更新状态 52 private synchronized void setState(int state){ 53 mState = state; 54 Message message = new Message(); 55 message.what = MainActivity.MESSAGE_STATE_CHANGE; 56 message.arg1 = state; 57 mHandler.sendMessage(message); 58 } 59 public synchronized int getState(){ 60 return mState; 61 } 62 63 //停止所有线程 64 public synchronized void stop() { 65 if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;} 66 if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} 67 setState(STATE_NONE); 68 } 69 //连接失败函数,通过UI发出“连接失败”的Toast 70 private void connectionFailed() { 71 setState(STATE_NONE); 72 // Send a failure message back to the Activity 73 Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_TOAST); 74 Bundle bundle = new Bundle(); 75 bundle.putString(MainActivity.TOAST, "连接失败"); 76 msg.setData(bundle); 77 mHandler.sendMessage(msg); 78 } 79 //连接丢失函数,通过UI发出“连接丢失”的Toast 80 private void connectionLost() { 81 setState(STATE_NONE); 82 83 // Send a failure message back to the Activity 84 Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_TOAST); 85 Bundle bundle = new Bundle(); 86 bundle.putString(MainActivity.TOAST, "连接丢失"); 87 msg.setData(bundle); 88 mHandler.sendMessage(msg); 89 } 90 private void sendFailed(){ 91 Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_TOAST); 92 Bundle bundle = new Bundle(); 93 bundle.putString(MainActivity.TOAST, "发送失败"); 94 msg.setData(bundle); 95 mHandler.sendMessage(msg); 96 } 97 //连接函数 98 public synchronized void connect(BluetoothDevice device){ 99 mConnectThread = new ConnectThread(device); 100 mConnectThread.start(); 101 setState(STATE_CONNECTING); 102 } 103 //连接线程类 104 private class ConnectThread extends Thread{ 105 private final BluetoothSocket mmSocket; 106 private final BluetoothDevice mmDevice; 107 //构造函数,获得BluetoothDevice,BluetoothSocket 108 public ConnectThread(BluetoothDevice device){ 109 mmDevice = device; 110 BluetoothSocket tmp = null; 111 try{ 112 tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 113 }catch (IOException e){ 114 connectionFailed(); 115 } 116 mmSocket = tmp; 117 } 118 //连接线程的执行逻辑,连接成功后转到ConnectedThraed 119 public void run(){ 120 mAdapter.cancelDiscovery(); 121 try{ 122 mmSocket.connect(); 123 }catch (IOException e){ 124 connectionFailed(); 125 try{ 126 mmSocket.close(); 127 }catch (IOException e2){ 128 } 129 return; 130 } 131 //此处开始connected线程 132 connected(mmSocket, mmDevice); 133 134 } 135 public void cancel(){ 136 try{ 137 mmSocket.close(); 138 }catch (IOException e){ 139 140 } 141 } 142 } 143 //开始已连接线程,发消息通知主活动更新UI 144 public synchronized void connected(BluetoothSocket socket,BluetoothDevice device){ 145 146 mConnectedThread = new ConnectedThread(socket); 147 mConnectedThread.start(); 148 149 Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_DEVICE_NAME); 150 Bundle bundle = new Bundle(); 151 bundle.putString(MainActivity.DEVICE_NAME,device.getName()); 152 msg.setData(bundle); 153 mHandler.sendMessage(msg); 154 setState(STATE_CONNECTED); 155 } 156 //已连接线程类 157 private class ConnectedThread extends Thread{ 158 private final BluetoothSocket mmSocket; 159 private final InputStream mmInStream; 160 //构造函数,获取InputStream,OutputStream 161 public ConnectedThread(BluetoothSocket socket){ 162 mmSocket = socket; 163 InputStream tmpIn = null; 164 OutputStream tmpOut = null; 165 //获取BluetoothSocket的输入输出流 166 try{ 167 tmpIn = socket.getInputStream(); 168 tmpOut = socket.getOutputStream(); 169 }catch (IOException e){ 170 171 } 172 mmInStream = tmpIn; 173 mmOutStream = tmpOut; 174 } 175 //已连接线程的执行逻辑,连接之后持续监听InputStream进行读取 176 public void run() { 177 while (true){ 178 try{ 179 byte[] arrayOfByte = new byte[1024]; 180 int length = 0; 181 length = mmInStream.read(arrayOfByte); 182 Message msg = new Message(); 183 msg.what = MainActivity.MESSAGE_READ; 184 msg.obj = new String(arrayOfByte,0,length); 185 mHandler.sendMessage(msg); 186 187 }catch (IOException e){ 188 connectionLost(); 189 return; 190 } 191 } 192 } 193 194 public void cancel(){ 195 try{ 196 mmSocket.close(); 197 }catch (IOException e){ 198 199 } 200 } 201 } 202 //写OutputStream函数,被Send按钮触发sendMessage调用 203 public void write(byte[] buffer){ 204 try{ 205 mmOutStream.write(buffer); 206 mHandler.obtainMessage(MainActivity.MESSAGE_WRITE,-1,-1,buffer).sendToTarget(); 207 }catch (IOException e){ 208 return; 209 } 210 } 211 }
五.Debug
六.运行效果