Android蓝牙开发
一、配置權限
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)寫出、讀入
?
轉載于:https://www.cnblogs.com/goodpan/p/5198743.html
總結
以上是生活随笔為你收集整理的Android蓝牙开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三天 css核心属性
- 下一篇: Android经常使用的五种弹出对话框