天天看點

Android通過廣播接收器BroadcastReceiver監聽藍牙打開關閉狀态變化

實際開發過程中需要通過對藍牙狀态的監聽以滿足需求,這裡對藍牙狀态的改變進行了一次封裝。

這裡運用了動态廣播注冊,優點是注冊取消可以由代碼控制,在用到的地方注冊,用不到的地方及時取消,避免對手機資源的浪費。

廣播接收器BlueToothStateReceiver類

import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 廣播監聽藍牙狀态
 */
public class BlueToothStateReceiver extends BroadcastReceiver {
    public static int DEFAULT_VALUE_BULUETOOTH = 1000;
    public OnBlueToothStateListener onBlueToothStateListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, DEFAULT_VALUE_BULUETOOTH);
            switch (state) {
                case BluetoothAdapter.STATE_OFF://藍牙已關閉
                    onBlueToothStateListener.onStateOff();
                    break;
                case BluetoothAdapter.STATE_ON://藍牙已開啟
                    onBlueToothStateListener.onStateOn();
                    break;
                case BluetoothAdapter.STATE_TURNING_ON://藍牙正在打開
                    onBlueToothStateListener.onStateTurningOn();
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF://藍牙正在關閉
                    onBlueToothStateListener.onStateTurningOff();
                    break;
                default:
                    Log.e("BlueToothError", "藍牙狀态未知");
            }
        }
    }

    public interface OnBlueToothStateListener {
        void onStateOff();

        void onStateOn();

        void onStateTurningOn();

        void onStateTurningOff();
    }

    public void setOnBlueToothStateListener(OnBlueToothStateListener onBlueToothStateListener) {
        this.onBlueToothStateListener = onBlueToothStateListener;
    }

}
           

接下來對調用工具類BlueToothUtils進行封裝,避免重複執行個體化,這裡使用單例模式。

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.IntentFilter;

/**
 * @author wang songbo
 */
public class BlueToothUtils {

    private static BlueToothUtils INSTANCE;

    public static synchronized BlueToothUtils getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new BlueToothUtils();
        }
        return INSTANCE;
    }

    BlueToothStateReceiver blueToothStateReceiver;

    //注冊廣播接收器,用于監聽藍牙狀态變化
    public void registerBlueToothStateReceiver(Activity activity) {
        //注冊廣播,藍牙狀态監聽
        blueToothStateReceiver = new BlueToothStateReceiver();
        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        activity.registerReceiver(blueToothStateReceiver, filter);
        blueToothStateReceiver.setOnBlueToothStateListener(new BlueToothStateReceiver.OnBlueToothStateListener() {
            @Override
            public void onStateOff() {
                //do something
            }

            @Override
            public void onStateOn() {
                //do something
            }

            @Override
            public void onStateTurningOn() {
                //do something
            }

            @Override
            public void onStateTurningOff() {
                //do something
            }
        });
    }

    public void unregisterBlueToothStateReceiver(Activity activity) {
        activity.unregisterReceiver(blueToothStateReceiver);
    }
}
           

在Activity中注冊廣播接收器

BlueToothUtils.getInstance().registerBlueToothStateReceiver(this);
           

在Activity中取消廣播接收器注冊

​BlueToothUtils.getInstance().unregisterBlueToothStateReceiver(this);
           

這個廣播接收器隻是擷取了藍牙狀态的變化,并不能判斷藍牙連接配接情況。将在下一篇寫出監聽藍牙連接配接狀态的廣播接收器封裝類。

注:AndroidMainfests.xml檔案中需加入藍牙權限:

<uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
           

藍牙連接配接狀态變化監聽傳送門:

https://blog.csdn.net/u010161303/article/details/88842804