一、注冊藍牙操作的相關權限
1、注冊權限需要在AndroidManifest.xml中注冊:
2、進行藍牙權限注冊
在這里我注冊了四個藍牙相關的權限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
在這里解釋一下這四個權限的作用:
android.permission.BLUETOOTH:允許程序連接到已配對的藍牙設備,用於連接或傳輸數據等配對后的操作。
android.permission.BLUETOOTH_ADMIN:此權限是以注冊“android.permission.BLUETOOTH”為前提的,作用是允許程序發現或配對藍牙設備
由於Android 6.0之后采用了新的權限機制來保護用戶隱私,因此需要另外添加android.permission.ACCESS_FINE_LOCATION和android.permission.ACCESS_COARSE_LOCATION權限
二、獲取藍牙設備器
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
使用getDefaultAdapter()返回一個BluetoothAdapter的實例。
三、開啟藍牙
protected void openBluetooth() { if (!bluetoothAdapter.isEnabled()) { //向用戶發出請求,開啟藍牙設備 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); }else{ Toast.makeText(this, "藍牙已開啟,請勿重復點擊!", Toast.LENGTH_SHORT).show(); } }
isEnable()判斷藍牙是否開啟,若已開啟返回true,反之則返回false。
ACTION_REQUEST_ENABLE是藍牙相關廣播的action值,用於請求用戶選擇是否打開藍牙。
四、關閉藍牙
protected void closeBluetooth() { if (bluetoothAdapter.isEnabled()) { bluetoothAdapter.disable(); Toast.makeText(MainActivity.this, "已關閉藍牙", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "藍牙已關閉,請勿重復點擊!", Toast.LENGTH_SHORT).show(); } }
關閉藍牙的操作和開啟藍牙的操作差不多,這里用到的disable()用來強制關閉藍牙。
五、搜索藍牙設備
1、定義兩個數組用來存放藍牙設備的信息:
public ArrayList<String> arrayList = null; public ArrayList<String> deviceName = null;
arrayList = new ArrayList<>(); deviceName = new ArrayList<>();
其中,arrayList用來存放藍牙設備地址,deviceName用來存放藍牙設備的名稱和地址並且在列表中顯示。
2、定義列表:此控件的使用需要用到為列表控件設置適配器,代碼如下:
public static ArrayAdapter adapter = null; ListView listView;
adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, deviceName); listView = (ListView) findViewById(R.id.act_main_list); listView.setAdapter(adapter);
若沒有為列表設置適配器,列表在搜索時將無法顯示出查找到的藍牙設備。
3、注冊廣播
private void registerReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(bluetoothReceiver, filter); }
4、創建廣播接收器,用於接受發現藍牙設備和查找完成的廣播
private final BroadcastReceiver bluetoothReceiver = 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); deviceName.add("設備名:" + device.getName() + "\n" + "設備地址:" + device.getAddress() + "\n");//將搜索到的藍牙名稱和地址添加到列表。 arrayList.add(device.getAddress());//將搜索到的藍牙地址添加到列表。 adapter.notifyDataSetChanged();//更新 } } };
5、搜索藍牙
protected void findBluetooth() { registerReceiver(); bluetoothAdapter.startDiscovery(); Toast.makeText(this, "搜索中...請稍后", Toast.LENGTH_SHORT).show(); }
這里使用startDiscovery()來搜索設備,且只能搜索到開啟了可見性的藍牙設備。
6、以上的開啟藍牙、關閉藍牙和搜索藍牙可以通過三個按鈕點擊事件來實現。
進入activity_main.xml中設置三個按鈕控件
設置按鈕控件代碼如下:
<Button android:id="@+id/open" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="開啟藍牙"/> <Button android:id="@+id/close" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="關閉藍牙"/> <Button android:id="@+idfind" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="搜索藍牙"/>
然后再回到MainActivity中進行代碼的編寫:
以下代碼為給三個按鈕分別設置打開,關閉和搜索藍牙三個事件。
public void myClick(View view){ switch (view.getId()){ case R.id.open: openBluetooth(); break; case R.id.close: closeBluetooth(); break; case R.id.find: findBluetooth(); break; } }
7、連接藍牙設備
注意:藍牙設備的連接的整個過程需子線程中執行!
作為客戶端連接:(每個設備作為一個客戶端去連接一個服務端,向對方發起連接)
a、設置列表點擊事件(點擊后完成 b 步驟並且啟動線程)
b、往線程類中傳入傳入BluetoothDevice的對象。此對象的值由存放遠程設備的地址的集合類傳入。
public static Context context; public static Context mge; public static BluetoothDevice device;
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); device = adapter.getRemoteDevice(arrayList.get(i)); clientThread = new ClientThread(device, mge, context); clientThread.start();
c、使用a中獲取的BluetoothDevice的對象來獲取BluetoothSocket的對象(在線程類中)
socket = (BluetoothSocket) device.getClass().getDeclaredMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);
d、建立連接(必須先取消掃描藍牙設備再進行連接)
bluetoothAdapter.cancelDiscovery(); socket.connect();//連接
文章到這里,藍牙設備的開啟,關閉,搜索與連接完成啦!這是本人第一次寫博客,若有不足之處請大家指正!
下篇文章我將寫如何利用藍牙發送數據與接收遠端設備的數據,並將收到的數據進行處理實現實時改變色板的顏色。