AndroidQ分區(qū)存儲權(quán)限變更及適配的實現(xiàn)
分區(qū)存儲
在Android Q中引入了分區(qū)儲存功能,在外部存儲設備中為每個應用提供了一個“隔離存儲沙盒”。其他應用無法直接訪問應用的沙盒文件。由于文件是應用的私有文件,不再需要任何權(quán)限即可訪問和保存自己的文件。此變更并有助于減少應用所需的權(quán)限數(shù)量,同時保證用戶文件的隱私性。
權(quán)限變更
Android Q 更改了應用對設備外部存儲設備中的文件(如:/sdcard )的訪問方式。繼續(xù)使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 權(quán)限,只不過當擁有這些權(quán)限的時候,你只能訪問媒體文件,無法訪問其他文件。
在早先的beta版本中,Android需要申請?zhí)囟ǖ拿襟w權(quán)限 :READ_MEDIA_IMAGES, READ_MEDIA_VIDEO , READ_MEDIA_AUDIO, 但是在beta4中,這些權(quán)限被廢棄。
訪問私有文件
應用需要將文件存儲在應用的沙盒中,并且訪問這個文件夾無需權(quán)限。官方推薦應用在沙盒內(nèi)存儲文件的地址為Context.getExternalFilesDir()下的文件夾。
比如要獲得一張圖片
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
訪問其他應用創(chuàng)建的文件
只有在滿足以下兩個條件時,您的應用才能訪問其他應用創(chuàng)建的文件:
1、 您的應用已獲得 READ_EXTERNAL_STORAGE 權(quán)限。
2、這些文件位于以下其中一個明確定義的媒體集合中:
照片:存儲在 MediaStore.Images 中。
視頻:存儲在 MediaStore.Video 中。
音樂文件:存儲在 MediaStore.Audio 中。
任何其他文件(包括“downloads”目錄下的文件),必須使用存儲訪問框架
注意:訪問外部存儲設備中的文件時會進入過濾視圖的應用不具有對 /sdcard/DCIM/IMG1024.JPG 等路徑的直接內(nèi)核訪問權(quán)限。要訪問此類文件,應用必須使用 MediaStore.openFile() 等方法。
卸載后保留應用的文件
文件存儲在應用私有目錄下,在卸載該應用后,系統(tǒng)會清除該應用的目錄中的所有文件(有點類似Android/data/xxx目錄)。有時我們要在卸載后保留這些文件,請將其保存到 MediaStore 中的某個目錄下。
選擇停用分區(qū)存儲
在Android Q設備上有兩種方式來讓分區(qū)存儲生效:
- 以 Android 9 或更低版本為目標平臺 (Target SDK <=28)
- 如果Target SDK > 28,請在manifest中添加android:requestLegacyExternalStorage=“true”
這樣就可以采用原有的存儲策略。以上方式不建議使用。
官方警告:明年,所有應用的主要平臺版本都需要分區(qū)存儲,無論其采用哪種目標 SDK 級別。
文件訪問權(quán)限摘要
| 文件位置 | 所需權(quán)限 | 訪問方法 | 卸載時是否刪除文件 |
|---|---|---|---|
| 應用私有目錄 | 無 | getExternalFilesDir() | 是 |
| 媒體集合(照片、視頻、音頻) | READ_EXTERNAL_STORAGE(僅當訪問其他應用的文件時) | MediaStore | 否 |
| 下載內(nèi)容(文檔和電子書籍) | 無 | 存儲訪問框架(加載系統(tǒng)的文件選擇器 | 否 |
您可以使用存儲訪問框架訪問上表中顯示的每個位置,而無需請求任何權(quán)限。
特定文件訪問適配
分享媒體文件
如果你的應用有分享照片和視頻需求。請使用 MediaStore存儲需要共享的文件。
如果您提供一組配套應用(例如短信應用和個人資料應用),請使用 content:// URI 設置文件共享。已經(jīng)建議將此工作流作為一項安全最佳做法。
使用文檔
如果需要打開企業(yè)辦公文檔或打開另存為 EPUB 文件的圖書。
通過調(diào)用 ACTION_OPEN_DOCUMENT intent 能選擇要打開的文件, intent 會打開系統(tǒng)的文件選擇器應用。顯示應用所支持類型的文件,intent 中需要包含Intent.EXTRA_MIME_TYPES extra
GitHub 上的 ActionOpenDocument 示例說明了如何使用 ACTION_OPEN_DOCUMENT 打開文件。
訪問和修改媒體內(nèi)容
上面已經(jīng)介紹過了不再重復,需要使用MediaStore
更新其他應用的媒體文件
Android Q以前應用都不太關(guān)注其它用戶組訪問應用目錄權(quán)限,適配Android Q后你會接到廠商要求你限定用戶組訪問存儲目錄權(quán)限問題單。
要修改另一個應用保存到外部存儲設備的給定媒體文件,請捕獲平臺拋出的 RecoverableSecurityException。然后,您可以請求用戶授予您的應用對此特定內(nèi)容的寫入權(quán)限。
照片中的位置信息
我們拍攝的照片一般在Exif元數(shù)據(jù)中包含了位置信息,在Android Q 以前我們可以方便的獲取到圖片的位置信息,Android Q 會默認對您的應用隱藏此類信息。并且這種位置信息限制與適用于相機功能的限制不同。
如果您的應用需要訪問照片的位置信息,請完成以下步驟:
將新的 ACCESS_MEDIA_LOCATION 權(quán)限添加到應用清單中。
在 MediaStore 對象中調(diào)用setRequireOriginal(),在調(diào)用時傳入照片的 URI。
val photoUri = MediaStore.setRequireOriginal(photoUri)
contentResolver.openInputStream(photoUri).use { stream ->
ExifInterface(stream).run {
// If lat/long is null, fall back to the coordinates (0, 0).
val latLong = ?: doubleArrayOf(0.0, 0.0)
}
}
到此這篇關(guān)于AndroidQ分區(qū)存儲權(quán)限變更及適配的實現(xiàn)的文章就介紹到這了,更多相關(guān)AndroidQ分區(qū)存儲權(quán)限變更內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android開發(fā)獲取手機Mac地址適配所有Android版本
- 詳解Android版本適配:9.0 Pie
- 適配Android 8.0版本更新安裝與通知欄的一些坑
- Android StatusBar 透明化方法(不同的版本適配)
- Android6.0獲取動態(tài)權(quán)限代碼示例
- Android6.0 動態(tài)權(quán)限機制深入講解
- androidQ sd卡權(quán)限使用詳解
- Android運行時權(quán)限終極方案(PermissionX)
- Android 如何實現(xiàn)動態(tài)申請權(quán)限
- Android普通應用升級為系統(tǒng)應用并獲取系統(tǒng)權(quán)限的操作
- Android 實現(xiàn)永久性開啟adb 的root權(quán)限
- Android 拍照選擇圖片并上傳功能的實現(xiàn)思路(包含權(quán)限動態(tài)獲取)
- Android 版本、權(quán)限適配相關(guān)總結(jié)
相關(guān)文章
使用Docker來加速構(gòu)建Android應用的基本部署思路解析
這篇文章主要介紹了使用Docker來加速構(gòu)建Android應用的部署思路解析,在服務器中通過Docker鏡像來獲得更高效的開發(fā)和測試流程,需要的朋友可以參考下2016-01-01
Flutter 實現(xiàn)網(wǎng)易云音樂字幕的代碼
這篇文章主要介紹了Flutter 實現(xiàn)網(wǎng)易云音樂字幕的代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Android實現(xiàn)EventBus登錄界面與傳值(粘性事件)
這篇文章主要為大家詳細介紹了Android實現(xiàn)EventBus登錄界面與傳值,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Android自定義控件實現(xiàn)帶數(shù)值和動畫的圓形進度條
這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)帶數(shù)值和動畫的圓形進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android數(shù)據(jù)庫中事務操作方法之銀行轉(zhuǎn)賬示例
這篇文章主要介紹了Android數(shù)據(jù)庫中事務操作方法之銀行轉(zhuǎn)賬,以具體的銀行轉(zhuǎn)賬為例分析了Android數(shù)據(jù)庫操作中事務的使用與回滾相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
AccessibilityService實現(xiàn)微信發(fā)紅包功能
這篇文章主要為大家詳細介紹了AccessibilityService實現(xiàn)微信發(fā)紅包功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12

