基于蓝牙的安卓客户端开发

一.安卓蓝牙开发基本流程

  • 获取本地蓝牙适配器,打开蓝牙,获得已配对蓝牙设备列表

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+"
");
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+"
");
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() + "
" + 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()+"
"+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

六.运行效果

                  

原文地址:https://www.cnblogs.com/wt-seu/p/6863652.html