【Android】【版本適配】Android11權(quán)限適配終極解決方案

Android11有了哪些改動(dòng)

Android11主要是進(jìn)一步收縮了應(yīng)用權(quán)限,在權(quán)限管理方面比以前更加嚴(yán)格

最主要,影響最大的,就是存儲(chǔ)卡訪問(wèn)權(quán)限的調(diào)整

從Android11開始,應(yīng)用將只能訪問(wèn)自己的私有目錄

其它目錄,只能判斷文件是否存在,但是既不能讀取,也不能寫入

這直接影響到文件選取、拍照錄像錄音、文件分享、文件下載等功能

對(duì)開發(fā)者影響非常大,特別是嚴(yán)重依賴于外部存儲(chǔ)的項(xiàng)目

應(yīng)對(duì)方案

首先擺正心態(tài),積極適配,不要抗拒變化,逃避問(wèn)題,影響比較多,我們逐個(gè)擊破

Android11獲取應(yīng)用安裝列表

Android11獲取應(yīng)用列表,需要登記額外權(quán)限

<!-- 獲取應(yīng)用列表 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

Android11使用外部存儲(chǔ)

Android11并沒有完全禁用外部存儲(chǔ)

但是只能通過(guò)用戶手動(dòng)授予權(quán)限的方式來(lái)實(shí)現(xiàn),不能通過(guò)代碼去申請(qǐng)

登記外部存儲(chǔ)訪問(wèn)權(quán)限

<!-- 存儲(chǔ) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 申請(qǐng)外部存儲(chǔ)訪問(wèn)權(quán)限 -->
<application
    android:preserveLegacyExternalStorage="true"
    android:requestLegacyExternalStorage="true">
</application>

判斷有沒有完全的外部存儲(chǔ)訪問(wèn)權(quán)限

Environment.isExternalStorageManager();

打開完全外部存儲(chǔ)訪問(wèn)權(quán)限申請(qǐng)頁(yè)面

Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 10001);

Android11使用公共媒體目錄

可通過(guò)以下API獲取公共媒體目錄

String documentDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).toString();
String downloadDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();

Android11使用私有目錄

這是Android官方推薦的做法,每個(gè)應(yīng)用只訪問(wèn)自己私有目錄的數(shù)據(jù)

這個(gè)目錄在存儲(chǔ)卡中是不可見的,只有應(yīng)用自己可以通過(guò)代碼訪問(wèn)

String privateRoot = Environment.getExternalStorageDirectory() + "/Android/data/" + CommonApplication.ctx.getPackageName() + "/";

微信分享

Android11中的分享失敗,是由文件訪問(wèn)權(quán)限間接引起的

解決以上問(wèn)題后,分享的問(wèn)題也就迎刃而解了

定義一個(gè)自己的FileProvider,通過(guò)FileProvider.getUriForFile來(lái)獲取Uri,然后通過(guò)Uri分享不會(huì)的搜索一下FileProvider和微信分享相關(guān)的博客就行了

————————————————
版權(quán)聲明:本文為CSDN博主「命運(yùn)之手」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013718730/article/details/118185047

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容