基於Android 6.0 的藍牙開發(1)-- 開啟,關閉,搜索,連接


 

 一、注冊藍牙操作的相關權限

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_LOCATIONandroid.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 = nullpublic 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();//連接

 

 文章到這里,藍牙設備的開啟,關閉,搜索與連接完成啦!這是本人第一次寫博客,若有不足之處請大家指正!

 下篇文章我將寫如何利用藍牙發送數據與接收遠端設備的數據,並將收到的數據進行處理實現實時改變色板的顏色。

 


免責聲明!

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



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