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