AndroidManifest.xml
<!--maxSdkVersion=30適配到Android11 -->
<uses-permission
? ? android:name="android.permission.BLUETOOTH"
? ? android:maxSdkVersion="30" />
<uses-permission
? ? android:name="android.permission.BLUETOOTH_ADMIN"
? ? android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--Android12新增藍(lán)牙權(quán)限 -->
<!-- Android 12在不申請定位權(quán)限時,必須加上android:usesPermissionFlags="neverForLocation",否則搜不到設(shè)備 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
? ? ? ? android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
代碼
//獲取藍(lán)牙適配器
public static BluetoothAdapter mBluetoothAdapter = null;
? ? //藍(lán)牙狀態(tài)監(jiān)聽廣播
public class BlueToothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case BluetoothAdapter.ACTION_STATE_CHANGED:
int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
switch (blueState) {
case BluetoothAdapter.STATE_TURNING_ON:
Log.e("onReceive", "---------藍(lán)牙正在打開中");
break;
case BluetoothAdapter.STATE_ON:
Log.e("onReceive", "---------藍(lán)牙已經(jīng)打開");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.e("onReceive", "---------藍(lán)牙正在關(guān)閉中");
break;
case BluetoothAdapter.STATE_OFF:
Log.e("onReceive", "---------藍(lán)牙已經(jīng)關(guān)閉");
break;
}
break;
}
}
}
? ? private IntentFilter makeFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
return filter;
}
? ? //Android12藍(lán)牙權(quán)限申請
private boolean bluePermission(){
? ? //compileSdkVersion項目中編譯SDK版本大于30申請以下權(quán)限可使用
? ? //Manifest.permission.BLUETOOTH_SCAN、Manifest.permission.BLUETOOTH_ADVERTISE、Manifest.permission.BLUETOOTH_CONNECT
? ? //若小于30可以直接使用權(quán)限對應(yīng)的字符串
if (Build.VERSION.SDK_INT>30){
if (ContextCompat.checkSelfPermission(this,
"android.permission.BLUETOOTH_SCAN")
!= PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this,
"android.permission.BLUETOOTH_ADVERTISE")
!= PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this,
"android.permission.BLUETOOTH_CONNECT")
!= PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_ADVERTISE",
"android.permission.BLUETOOTH_CONNECT"}, 1);
return false;
}
}
return true;
}
? ? private void openBlueTooth(){
if (bluePermission())
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
else
return;
BlueToothReceiver btlr = new BlueToothReceiver();
this.registerReceiver(btlr, makeFilter());
? ? ? ? if (!mBluetoothAdapter.isEnabled()) {// 判斷是否打開藍(lán)牙
showHandlerToast("請先開啟藍(lán)牙!");
//彈出對話框提示用戶是后打開
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//startActivityForResult(intent, SEARCH_CODE);
// 不做提示,強行打開
mBluetoothAdapter.enable();
}
? ? }
說明:
必須按照這兩步申請藍(lán)牙權(quán)限,首先在androidManifest.xml中配置藍(lán)牙權(quán)限,Android11及以下android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN申請這兩個,Android12中藍(lán)牙權(quán)限進(jìn)行新增android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_ADVERTISE、android.permission.BLUETOOTH_CONNECT使用這三個;其次在代碼中需要動態(tài)申請Android12的藍(lán)牙權(quán)限,測試發(fā)現(xiàn)Android12中動態(tài)申請權(quán)限后則藍(lán)牙直接開啟,通過對藍(lán)牙狀態(tài)的監(jiān)聽獲取藍(lán)牙適配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();文章來源:http://www.zghlxwxcb.cn/news/detail-503673.html
注意:不管是Android12還是Android12以下不打開藍(lán)牙都是無法獲取藍(lán)牙適配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();打開藍(lán)牙則可以獲取到藍(lán)牙適配器,但若沒有申請藍(lán)牙所需權(quán)限,藍(lán)牙功能也是無法使用?。?!二者缺一不可文章來源地址http://www.zghlxwxcb.cn/news/detail-503673.html
到了這里,關(guān)于Android12中藍(lán)牙權(quán)限適配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!