zoukankan      html  css  js  c++  java
  • 基于蓝牙的安卓客户端开发

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

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

    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

    六.运行效果

                      

  • 相关阅读:
    创建窗口
    文件映射
    匿名管道
    MFC之进度条CProgressCtrl
    跨进程使用句柄和文件操作
    redis安装配置
    git全部操作
    idea中Entity实体中报错:cannot resolve column/table/
    Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon
    sql操作
  • 原文地址:https://www.cnblogs.com/wt-seu/p/6863652.html
Copyright © 2011-2022 走看看