Android 藍牙操作詳解


1.啟用藍牙並使設備處於可發現狀態    


   1.1 在使用BluetoothAdapter類的實例進操作之前,應啟用isEnable()方法檢查設備是否啟用了藍牙適配器。
 
    // 使用意圖提示用戶啟用藍牙,並使設備處於可發現狀態
      private  void  startBluetooth() {
          BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
            // 檢測藍牙是否開啟
            if  (!bt.isEnabled()) {
              Intent enableIntent =  new  Intent(
                        BluetoothAdapter.  ACTION_REQUEST_ENABLE );
              startActivityForResult(enableIntent,  REQUEST_ENABLE_BT );
          }
     }
 1.2返回意圖活動時,調用onActivityResult(),可以提取主設備名稱和 mac地址
 
  protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
            if  (requestCode ==  REQUEST_ENABLE_BT
                   && resultCode == Activity.  RESULT_OK ) {
              BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
              String address = bt.getAddress();
              String name = bt.getName();
              String toastText = name +  " :"  + address;
              Toast. makeText( this , toastText, Toast. LENGTH_LONG ).show();
              discoverable();
          }
     }
1.3 請求用戶授權,讓設備可被其它臨近設備發現:
      // 請求用戶授權,讓設備在120秒內處於可發現狀態
      private  void  discoverable() {
          Intent discoverableIntent =  new  Intent(
                    BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE );
          startActivity(discoverableIntent);
     }

 

2.連接啟用藍牙設備

 
 2.1對於任何藍牙應用,都必須在AndroidManifst.xml中添加如下權限:
       <uses-permission android:name"android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name"android.permission.BLUETOOTH" />
 
  2.2 創建到其他藍牙設備的套接字連接
     我們應該在一個線程內持續監聽套接字流中的數據。可以在該線程外寫入連接的流。這種連接是一個阻塞調用,由於藍牙設備發現是一個緩慢的過程,可能降低連接速率。所以,在連接其它設備之前要取消設備發現。
     藍牙套接字連接時阻塞調用,只在連接成功或者連接設備發生異常時才會返回。BluetoothConnection一經實例化,就會創建到其他設備的連接,並開始監聽來自連接設備的數據。
package com.example.blueoothdemo;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

/**
* 讀寫藍牙設備
*
* @author hbbliyong
*
*/
public class BluetoothConnecion extends Thread {
     private final BluetoothSocket mSocket;
     private final InputStream mInStream;
     private final OutputStream mOutStream;
     byte[] buffer;
     private final BluetoothAdapter mAdapter;
     // 用於本應用程序唯一的UUID,
     private static final UUID MY_UUID = UUID
               .fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");

     public BluetoothConnecion(BluetoothDevice device) {
          BluetoothSocket tmp = null;
          mAdapter = BluetoothAdapter.getDefaultAdapter();
          // 獲得用於指定藍牙連接的BluetoothSocket
          try {
               tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
          } catch (Exception e) {
               e.printStackTrace();
          }
          mSocket = tmp;

          // 在新線程中建立套接字連接,避免FC
          Thread connectionThread = new Thread(new Runnable() {
               @Override
               public void run() {
                    // TODO Auto-generated method stub
                    // 始終取消發現,因為它會降低連接的速度
                    mAdapter.cancelDiscovery();

                    // 建立到BluetoothSocket的連接
                    try {
                         // 這是一個阻塞調用,只在成功連接或者異常時返回
                         mSocket.connect();
                    } catch (Exception e) {
                         e.printStackTrace();
                         // 設備連接失敗,關閉套接字
                         try {
                              mSocket.close();
                         } catch (Exception e2) {
                              // TODO: handle exception
                              e2.printStackTrace();
                         }
                    }
               }
          });

          connectionThread.start();

          InputStream tmpIn = null;
          OutputStream tmpOut = null;

          // 獲得BluetoothSoket輸入輸出流
          try {
               tmpIn = mSocket.getInputStream();
               tmpOut = mSocket.getOutputStream();
               buffer = new byte[1024];
          } catch (Exception e) {
               e.printStackTrace();
          }
          mInStream = tmpIn;
          mOutStream = tmpOut;
     }

     public void run() {
          // 連接時保持監聽InputStream
          while (true) {
               try {
                    // 從套接字流讀取數據
                    mInStream.read(buffer);
                    // 向UI Activity發送獲取的數據
               } catch (Exception e) {
                    // TODO: handle exception
                    // 這里的異常標志着連接的丟失
                    // 向UI Activity發送獲取的數據
                    break;
               }
          }
     }
    
     public void write(byte[] buffer)
     {
          try {
               mOutStream.write(buffer);
          } catch (Exception e) {
               e.printStackTrace();
          }
     }
    
     public void cancel()
     {
          try {
               mSocket.close();
          } catch (Exception e) {
               // TODO: handle exception
               e.printStackTrace();
          }
     }
}
 

3.監聽和接收藍牙連接請求

 
     在兩個藍牙設備交互之前,其中一個通信設備必須起服務器的作用。它獲取一個BluetoothServerSocket實例並監聽入站請求。這個實例通過調用藍牙適配器上的listenUsingRfcommWithServiceRecord()方法獲得。有了這個實例我們可以通過start()方法開始監聽來自遠程設備的入站請求。
 
   //使主設備處於可發現狀態
  Intent disCoverableIntent =  new  Intent(
                      BluetoothAdapter.  ACTION_REQUEST_DISCOVERABLE );
  startActivityForResult(disCoverableIntent, DISCOVERY_REQUEST_BLUETOOTH  );
 
 
//創建一個藍牙服務器並接受連接
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
 
            if  (requestCode ==  DISCOVERY_REQUEST_BLUETOOTH  ) {
                boolean  isDiscoverable = resultCode > 0;
                if  (isDiscoverable) {
                     // UUID
                     // uuid=UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");
                     final  UUID uuid = UUID.randomUUID();
                     final  String serverName =  "BTServer"  ;
                     final  BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
 
                     final  BluetoothServerSocket bluetoothServer;
 
                   Thread listenThread =  new  Thread( new  Runnable() {
 
                          @Override
                          public  void  run() {
                               //  TODO  Auto-generated method stub
                               try  {
                                  bluetoothServer = bt.listenUsingRfcommWithServiceRecord(serverName, uuid);
                    BluetoothSocket serverSocket = bluetoothServer.accept();
                    myHandleConnectionWiht(serverSocket);
 
                             }  catch  (Exception e) {
                                  e.printStackTrace();
                                  
                             }
                        }
 
                          private  void  myHandleConnectionWiht(
                                  BluetoothSocket serverSocket) {
                               //  TODO  Auto-generated method stub
                             
                        }
 
                   });
                   listenThread.start();
              }
          }
     }



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM