Android Bluetooth基本操作

8924 ワード

Bluetoothは、デバイスの短距離伝送データをサポートする無線技術です.Androidは2.0以降、この方面のサポートを提供した.Bluetoothデバイスの検索から相互通信が可能になるまで、いくつかの基本手順(本機はサーバとする):1を経なければならない.権限の設定manifestでの構成

  
  


2.Bluetoothを起動するには、まず、Bluetoothがサポートされているかどうかを確認し、Bluetoothアダプタオブジェクトを取得します.
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  
if(mBluetoothAdapter == null){  
        //            sijienet.com
        return;  
}  
if(!mBluetoothAdapter.isEnabled()){ //     ,       
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);  
}  
//......  
public void onActivityResult(int requestCode, int resultCode, Intent data){  
       if(requestCode == REQUEST_ENABLE_BT){  
              if(requestCode == RESULT_OK){  
                   //         
              }  
       }  
}  

3.Bluetoothデバイスの発見ここでは、いくつかの態様に細分化することができます(1)本機のBluetoothを可視化(すなわち、検索しやすい状態)し、他のデバイスが本機のBluetoothを発見するのに便利です.
//      300        
private void ensureDiscoverable() {  
        if (mBluetoothAdapter.getScanMode() !=  
            BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {  
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);  
            startActivity(discoverableIntent);  
        }  
}  

(2)ペアリングされたBluetoothデバイス、すなわち以前ペアリングされたデバイスの検索
Set pairedDevices = mBluetoothAdapter.getBondedDevices();  
if (pairedDevices.size() > 0) {  
    findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);  
    for (BluetoothDevice device : pairedDevices) {  
        //device.getName() +" "+ device.getAddress());  
    }  
} else {  
    mPairedDevicesArrayAdapter.add("          ");  
} 

(3)mBluetoothAdapter.startDiscovery();この検索結果を取得するには、BroadcastReceiverを登録して取得する必要があります.登録してから情報を取得し、処理します.

//  ,           onReceive  
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  
        this.registerReceiver(mReceiver, filter);  
  
//        onReceive  
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  
        this.registerReceiver(mReceiver, filter);  
//.......  
private 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() + "
" + device.getAddress()); // } }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { // if (mNewDevicesArrayAdapter.getCount() == 0) { mNewDevicesArrayAdapter.add(" "); } } } };

4.接続を確立してデバイスを見つけたら、自機と他のデバイスとの接続を確立する必要がある.通常、本機で他のBluetoothデバイスを検索する場合、本機はサービス側として、他のデバイスの接続を受信することができます.サーバー側のスレッドを起動し、クライアントの接続をデッドサイクルで待機します.これはServer Socketと極めて似ています.このスレッドは接続の準備をする前に起動します
//UUID           
private static final UUID MY_UUID =  
        UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");  
   //                     
    private class AcceptThread extends Thread{  
        private BluetoothServerSocket serverSocket;  
          
        public AcceptThread(boolean secure){  
            BluetoothServerSocket temp = null;  
            try {  
                temp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(  
                            NAME_INSECURE, MY_UUID);  
            } catch (IOException e) {  
                  Log.e("app", "listen() failed", e);  
            }  
            serverSocket = temp;  
        }  
          
        public void run(){  
            BluetoothSocket socket=null;  
            while(true){  
                try {  
                    socket = serverSocket.accept();  
                } catch (IOException e) {  
                     Log.e("app", "accept() failed", e);  
                     break;  
                }  
            }  
            if(socket!=null){  
                //              ,  socket     
            }  
        }  
          
        //      
        public void cancel(){     
            try {  
                serverSocket.close();  
            } catch (IOException e) {  
                Log.e("app", "Socket Type" + socketType + "close() of server failed", e);  
            }  
        }  
  
}  

デバイスを検索するデバイスのアドレスを取得し、このアドレスでBluetoothDevicedオブジェクトを取得することで、クライアントとして、このオブジェクトdeviceを通過することができる.createRfcommSocketToServiceRecord(MY_UUID);同一のUUIDとサービス
器は接続を確立して別のsocketオブジェクトを取得し、それによってサービス側とクライアントにそれぞれ1つのsocketオブジェクトがあり、この時彼らは互いにデータを交換することができるようになった.クライアントsocketを作成してスレッドを確立
//          ,        
 private class ConnectThread extends Thread{  
    private BluetoothSocket socket;  
    private BluetoothDevice device;  
    public ConnectThread(BluetoothDevice device,boolean secure){  
        this.device = device;  
        BluetoothSocket tmp = null;  
        try {  
    tmp = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);  
} catch (IOException e) {  
     Log.e("app", "create() failed", e);  
}  
    }  
      
    public void run(){  
        mBluetoothAdapter.cancelDiscovery();    //        
        try {  
    socket.connect();  
} catch (IOException e) {  
    try {  
        socket.close();  
    } catch (IOException e1) {  
         Log.e("app", "unable to close() "+  
                          " socket during connection failure", e1);  
    }  
    connetionFailed();  //      
    return;  
}  
      //              ,  socket     
    }  
      
      public void cancel() {  
           try {  
               socket.close();  
           } catch (IOException e) {  
               Log.e("app", "close() of connect  socket failed", e);  
           }  
       }  
 }  

5.データ通信スレッドを確立し、データの読み取りを行う

//     ,           
    private class ConnectedThread extends Thread{  
        private BluetoothSocket socket;  
        private InputStream inStream;  
        private OutputStream outStream;  
          
        public ConnectedThread(BluetoothSocket socket){  
              
            this.socket = socket;  
            try {  
                //         
                inStream = socket.getInputStream();  
                outStream = socket.getOutputStream();  
            } catch (IOException e) {  
                Log.e("app", "temp sockets not created", e);  
            }  
        }  
          
        public void run(){  
            byte[] buff = new byte[1024];  
            int len=0;  
            //        ,      
            while(true){  
                try {  
                    len = inStream.read(buff);  
                    //          UI      
                    Message msg = handler.obtainMessage(BluetoothChat.MESSAGE_READ,  
                            len, -1, buff);  
                    msg.sendToTarget();  
                } catch (IOException e) {  
                    Log.e("app", "disconnected", e);  
                    connectionLost();   //      
                    start();    //         
                    break;  
                }  
            }  
        }  
          
          
        public void write(byte[] buffer) {  
            try {  
                outStream.write(buffer);  
  
                // Share the sent message back to the UI Activity  
                handler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer)  
                        .sendToTarget();  
            } catch (IOException e) {  
                Log.e("app", "Exception during write", e);  
            }  
        }  
  
        public void cancel() {  
            try {  
                socket.close();  
            } catch (IOException e) {  
                Log.e("app", "close() of connect socket failed", e);  
            }  
        }  
    }  


Bluetoothの基本操作が完了し、socketに対して一定の認識を持つ子供靴が熟練して操作できるようになります.