標籤:
一、配置許可權
AndroidManifest.xml裡加入許可權
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
二、相關API
Android所有關於藍芽開發的類都在android.bluetooth包下:
1.BluetoothAdapter類:
描述:
藍芽適配器,代表本地的藍芽適配器裝置。BluetoothAdapter類讓使用者能執行基本的藍芽任務。例如: 初始化裝置的搜尋,查詢可匹配的裝置集,使用一個已知的MAC地址來初始化一個BluetoothDevice類,建立一個 BluetoothServerSocket類以監聽其它裝置對原生串連請求等。
為了得到這個代表本地藍芽適配器的 BluetoothAdapter類,調用getDefaultAdapter()這一靜態方法。這是所有藍芽動作使用的第一步。當擁有本地適配器以後, 使用者可以獲得一系列的BluetoothDevice對象,這些對象代表所有擁有getBondedDevice()方法的已經匹配的裝置;用 startDiscovery()方法來開始裝置的搜尋;或者建立一個BluetoothServerSocket類,通過 listenUsingRfcommWithServiceRecord(String, UUID)方法來監聽新來的串連請求。
方法:
1)cancelDiscovery()
根據字面意思,是取消發現,也就是說當我們正在搜尋裝置的時候調用這個方法將不再繼續搜尋
2)disable()關閉藍芽
3)enable()開啟藍芽
這個方法開啟藍芽不會彈出提示,更多的時候我們需要問下使用者是否開啟,一下這兩行代碼同樣是開啟藍芽,不過會提示使用者:
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
4)getAddress()擷取本地藍芽地址
5)getDefaultAdapter()擷取預設BluetoothAdapter,實際上,也只有這一種方法擷取BluetoothAdapter
6)getName()擷取本地藍芽名稱
7)getRemoteDevice(String address)根據藍芽地址擷取遠程藍牙裝置
8)getState()擷取本地藍芽適配器目前狀態(感覺可能調試的時候更需要)
9)isDiscovering()判斷當前是否正在尋找裝置,是返回true
10)isEnabled()判斷藍芽是否開啟,已開啟返回true,否則,返回false
11)listenUsingRfcommWithServiceRecord(String name,UUID uuid)根據名稱,UUID建立並返回BluetoothServerSocket,這是建立BluetoothSocket伺服器端的第一步
12)startDiscovery()開始搜尋,這是搜尋的第一步
2.BluetoothDevice類
描述
代表一個遠程藍牙裝置。讓你建立一個帶有各自裝置的BluetoothDevice或者查詢其皆如名稱、地址、類和串連狀態等資訊。
對於藍芽硬體地址而言,這個類僅僅是一個瘦封裝器。這個類的對象是不可改變的。這個類上的操作會使用這個用來建立BluetoothDevice類的BluetoothAdapter類執行在遠程藍芽硬體上。
為了獲得BluetoothDevice,類,使用BluetoothAdapter.getRemoteDevice(String)方法去建立一個表示 已知MAC地址的裝置(使用者可以通過帶有BluetoothAdapter類來完成對裝置的尋找)或者從一個通過 BluetoothAdapter.getBondedDevices()得到傳回值的有聯絡的裝置集合來得到該裝置。
方法
1)createRfcommSocketToServiceRecord(UUIDuuid)根據UUID建立並返回一個BluetoothSocket
這個方法也是我們擷取BluetoothDevice的目的——建立BluetoothSocket
2)getAddress()同BluetoothAdapter
3)getName()同BluetoothAdapter
3.BluetoothServerSocket
描述
一個藍芽監聽連接埠。 藍芽連接埠監聽介面和TCP連接埠類似:Socket和ServerSocket類。在伺服器端,使用BluetoothServerSocket類來建立一個 監聽服務連接埠。當一個串連被BluetoothServerSocket所接受,它會返回一個新的BluetoothSocket來管理該串連。在客戶 端,使用一個單獨的BluetoothSocket類去初始化一個外接串連和管理該串連。
最通常使用的藍芽連接埠是RFCOMM,它是被Android API支援的類型。RFCOMM是一個連線導向,通過藍芽模組進行的資料流傳輸方式,它也被稱為序列埠規範(Serial Port Profile,SPP)。
為了建立一個對準備好的新來的串連去進行監聽BluetoothServerSocket類,使用 BluetoothAdapter.listenUsingRfcommWithServiceRecord()方法。然後調用accept()方法去監 聽該連結的請求。在串連建立之前,該調用會被阻斷,也就是說,它將返回一個BluetoothSocket類去管理該串連。每次獲得該類之後,如果不再需 要接受串連,最好調用在BluetoothServerSocket類下的close()方法。關閉BluetoothServerSocket類不會關 閉這個已經返回的BluetoothSocket類。
BluetoothSocket類安全執行緒。特別的,close()方法總會馬上放棄外界操作並關閉伺服器連接埠。
方法
1)accept()
阻塞直到一個串連已經建立。(譯者註:預設逾時時間設定為-1,見源碼)
在一個成功建立的串連上返回一個已串連的BluetoothSocket類。
每當該調用返回的時候,它可以在此調用去接收以後新來的串連。
2)accept(inttimeout)
阻塞直到逾時時間內的串連建立。
在一個成功建立的串連上返回一個已串連的BluetoothSocket類。
每當該調用返回的時候,它可以在此調用去接收以後新來的串連。
3)close()
用來放棄從另一線程來的調用。
馬上關閉連接埠,並釋放所有相關的資源。
在其他線程的該連接埠中引起阻塞,從而使系統馬上拋出一個IO異常。
關閉BluetoothServerSocket不會關閉接受自accept()的任意BluetoothSocket。
4.BluetoothSocket
描述
已串連或串連到藍芽通訊端(socket)。
藍芽連接埠監聽介面和TCP連接埠類似:Socket和ServerSocket類。在伺服器端,使用BluetoothServerSocket類來建立一個 監聽服務連接埠。當一個串連被BluetoothServerSocket所接受,它會返回一個新的BluetoothSocket來管理該串連。在客戶 端,使用一個單獨的BluetoothSocket類去初始化一個外接串連和管理該串連。
最通常使用的藍芽連接埠是RFCOMM,它是被Android API支援的類型。RFCOMM是一個連線導向,通過藍芽模組進行的資料流傳輸方式,它也被稱為序列埠規範(Serial Port Profile,SPP)。
為了建立一個BluetoothSocket去串連到一個已知裝置,使用方法 BluetoothDevice.createRfcommSocketToServiceRecord()。然後調用connect()方法去嘗試一個 面向遠程裝置的串連。這個調用將被阻塞指導一個串連已經建立或者該連結失效。
為了建立一個BluetoothSocket作為服務端(或者“主機”),查看BluetoothServerSocket文檔。
每當該連接埠串連成功,無論它初始化為用戶端,或者被接受作為伺服器端,通過getInputStream()和getOutputStream()來開啟IO流,從而獲得各自的InputStream和OutputStream對象
BluetoothSocket類安全執行緒。特別的,close()方法總會馬上放棄外界操作並關閉伺服器連接埠。
方法
1)close() 關閉
2)connect() 串連
3)getInptuStream() 擷取輸入資料流
4)getOutputStream() 擷取輸出資料流
5)getRemoteDevice() 擷取遠程裝置,這裡指的是擷取bluetoothSocket指定串連的那個遠程藍牙裝置
三、操作
1、擷取本地藍芽適配器
BluetoothAdapter mAdapter= BluetoothAdapter.getDefaultAdapter();
2、開啟藍芽
if(!mAdapter.isEnabled()){//彈出對話方塊提示使用者是後開啟Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enabler, REQUEST_ENABLE);//不做提示,強行開啟// mAdapter.enable();}
3、搜尋裝置
BroadcastReceiver mReceiver = new BroadcastReceiver() { 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) { Log.v(TAG, "find device:" + device.getName() + device.getAddress()); } } //搜尋完成 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setTitle("搜尋完成"); if (mNewDevicesAdapter.getCount() == 0) { Log.v(TAG,"find over"); } } //執行更新列表的代碼 }};
onCreate()中代碼
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter);filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(mReceiver, filter);
4、建立串連
首先Android sdk(2.0以上版本)支援的藍芽串連是通過BluetoothSocket建立串連(說的不對請高人指正),伺服器端(BluetoothServerSocket)和用戶端(BluetoothSocket)需指定同樣的UUID,才能建立串連,因為建立串連的方法會阻塞線程,所以伺服器端和用戶端都應啟動新線程串連
1)伺服器端:
//UUID格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到 //http://www.uuidgenerator.com 申請BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);serverSocket.accept();
2)用戶端:
BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);clienSocket.connect();
5、資料傳遞,通過以上操作,就已經建立的BluetoothSocket串連了,資料傳遞無非是通過流的形式
1)擷取流
inputStream = socket.getInputStream();outputStream = socket.getOutputStream();
2)寫出、讀入
Android藍芽開發