項(xiàng)目配置是compileSdkVersion31?targetSdkVersion30? 手機(jī)升級了Android 12后運(yùn)行Crash这溅。照理說targetSdkVersion沒有用31脏答,怎么會(huì)報(bào)Android 12的藍(lán)牙權(quán)限錯(cuò)誤猾普,百思不得其解皮获,先來看看Android12的藍(lán)牙權(quán)限乓梨。
1.Manifest權(quán)限
<manifest>? ?
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<!--請求舊設(shè)備上的藍(lán)牙權(quán)限牲剃,可設(shè)置android:maxSdkVersion為30遣疯。這個(gè)兼容性步驟幫助系統(tǒng)只授予你的應(yīng)用程序所需的藍(lán)牙權(quán)限,當(dāng)安裝在運(yùn)行Android 12或更高的設(shè)備上凿傅。>? ?
<uses-permission android:name="android.permission.BLUETOOTH"? ? ? ? ? ? ? ? ? ? android:maxSdkVersion="30" />? ?
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"? ? ? ? ? ? ? ? ? ? ?android:maxSdkVersion="30" />? ?
<!-- 有藍(lán)牙掃描功能的時(shí)候需要缠犀。?-->
? <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />? ?
<!--如果你的應(yīng)用程序不使用藍(lán)牙掃描結(jié)果得出物理位置信息,可以加上usesPermissionFlags聲明你的scan結(jié)果不會(huì)用于推導(dǎo)出物理位置聪舒。-->?
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"? ? ? ? ? ? ? ? ? ? ?android:usesPermissionFlags="neverForLocation" />
<!--僅當(dāng)你的應(yīng)用程序使設(shè)備可被藍(lán)牙設(shè)備發(fā)現(xiàn)時(shí)需要辨液。 -->? ?
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />? ?
<!-- 只有當(dāng)你的應(yīng)用程序與已經(jīng)配對的藍(lán)牙設(shè)備通信時(shí)才需要。 -->? ?
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />? ?
<!-- 只有當(dāng)你的應(yīng)用程序使用藍(lán)牙掃描結(jié)果來獲取物理位置時(shí)才需要箱残。-->?
? <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />? ??
<!--在Android 12 如果你確定你的應(yīng)用程序從來沒有從藍(lán)牙掃描結(jié)果獲取物理位置滔迈,則不需要這個(gè)權(quán)限。-->??
<!--在Android 12以下 這個(gè)權(quán)限是必須要的-->??
? <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
?<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--如果你的應(yīng)用程序支持一個(gè)服務(wù)疚宇,并且可以運(yùn)行在Android 10 (API級別29)或Android 11亡鼠,你還必須聲明ACCESS_BACKGROUND_LOCATION權(quán)限來發(fā)現(xiàn)藍(lán)牙設(shè)備。-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
2.動(dòng)態(tài)請求相關(guān)藍(lán)牙權(quán)限
BLUETOOTH_ADVERTISE敷待、BLUETOOTH_CONNECT和BLUETOOTH_SCAN權(quán)限是運(yùn)行時(shí)權(quán)限间涵。因此必須在應(yīng)用程序中明確請求用戶批準(zhǔn),才能查找藍(lán)牙設(shè)備榜揖,使設(shè)備可被其他設(shè)備發(fā)現(xiàn)勾哩,或與已經(jīng)配對的藍(lán)牙設(shè)備通信。當(dāng)你的應(yīng)用程序請求這些權(quán)限中的至少一個(gè)举哟,系統(tǒng)提示用戶允許你的應(yīng)用程序訪問附近的設(shè)備思劳,如圖1所示。
//所以請加上這段代碼
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
? ? if (!checkSinglePermission(Manifest.permission.BLUETOOTH_SCAN) ||!checkSinglePermission(Manifest.permission.BLUETOOTH_CONNECT)) {
????????String[] list =new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT};
? ? ? ? requestPermissions(list, Constants.PERMISSION_REQUEST_SCAN);
? ? }
}
3.為什么閃退
先完成1妨猩,2兩步潜叛, 然后再去做各種藍(lán)牙有關(guān)的操作,不然在Android 12 手機(jī)上會(huì)直接閃退:琛威兜!
參考鏈接:
https://stackoverflow.com/questions/67722950/android-12-new-bluetooth-permissions