根據google官方資料,Android 12(API 31) 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 權限,可讓您的應用掃描附近的設備,而無需請求位置權限,這幾個權限是運行時權限,用于查找藍牙設備、使某個設備可被其他設備檢測到,或者與已配對的藍牙設備通信,必須主動申請,
最近正好又在做藍牙相關的專案,發現網上的一些資料并不夠全面,特整理此文,
權限宣告
在Android 6-11的機型上如果使用藍牙搜索設備,仍然需要請求定位權限和以前的藍牙權限BLUETOOTH、BLUETOOTH_ADMIN,那么如何宣告權限呢?在清單檔案中可以使用android:maxSdkVersion="30"限定需要申請權限的Android版本,這樣在Android 12及以上機型上,應用詳情中的權限串列將不會列出這些權限,如果應用中除藍牙外其他功能還需要使用定位權限,請勿針對ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION這兩個權限添加android:maxSdkVersion限制,
<!-- Android 12以下才需要定位權限, Android 9以下官方建議申請ACCESS_COARSE_LOCATION -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Android 12在不申請定位權限時,必須加上android:usesPermissionFlags="neverForLocation",否則搜不到設備 -->
<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" />
特別需要注意的是,Android 12及以上機型,如果想不申請定位權限就能搜索到設備,必須在BLUETOOTH_SCAN權限上加上android:usesPermissionFlags="neverForLocation",否則仍需申請定位權限,
申請權限
private final int REQUEST_PERMISSION_CODE = 1001;
private void initPermission() {
List<String> mPermissionList = new ArrayList<>();
// Android 版本大于等于 12 時,申請新的藍牙權限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
mPermissionList.add(Manifest.permission.BLUETOOTH_SCAN);
mPermissionList.add(Manifest.permission.BLUETOOTH_ADVERTISE);
mPermissionList.add(Manifest.permission.BLUETOOTH_CONNECT);
//根據實際需要申請定位權限
//mPermissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
//mPermissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
} else {
mPermissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
mPermissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
ActivityCompat.requestPermissions(this, mPermissionList.toArray(new String[0]), REQUEST_PERMISSION_CODE);
}
參考資料
Android 12 中的新藍牙權限 | Android Developers
https://developer.android.google.cn/about/versions/12/features/bluetooth-permissions
對藍牙通訊感興趣的朋友可以看看我的這個專案
BluetoothChat_one2more: 一對多藍牙連接示例,基于Google BluetoothChat修改,實作一對多聊天(一個服務端、多個客戶端),類似聊天室,
https://github.com/fly263/BluetoothChat_one2more
感謝閱讀,歡迎打賞,原創文章,未經允許不得轉載,特別鄙視轉載不注明出處者!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509278.html
標籤:其他
上一篇:日本開放Wi-Fi 6E認證
下一篇:日本開放Wi-Fi 6E認證
