AndroidQ分區(qū)存儲權(quán)限變更及適配的實現(xiàn)
分區(qū)存儲
在Android Q中引入了分區(qū)儲存功能,在外部存儲設(shè)備中為每個應(yīng)用提供了一個“隔離存儲沙盒”。其他應(yīng)用無法直接訪問應(yīng)用的沙盒文件。由于文件是應(yīng)用的私有文件,不再需要任何權(quán)限即可訪問和保存自己的文件。此變更并有助于減少應(yīng)用所需的權(quán)限數(shù)量,同時保證用戶文件的隱私性。
權(quán)限變更
Android Q 更改了應(yīng)用對設(shè)備外部存儲設(shè)備中的文件(如:/sdcard )的訪問方式。繼續(xù)使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 權(quán)限,只不過當(dāng)擁有這些權(quán)限的時候,你只能訪問媒體文件,無法訪問其他文件。
在早先的beta版本中,Android需要申請?zhí)囟ǖ拿襟w權(quán)限 :READ_MEDIA_IMAGES, READ_MEDIA_VIDEO , READ_MEDIA_AUDIO, 但是在beta4中,這些權(quán)限被廢棄。
訪問私有文件
應(yīng)用需要將文件存儲在應(yīng)用的沙盒中,并且訪問這個文件夾無需權(quán)限。官方推薦應(yīng)用在沙盒內(nèi)存儲文件的地址為Context.getExternalFilesDir()下的文件夾。
比如要獲得一張圖片
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
訪問其他應(yīng)用創(chuàng)建的文件
只有在滿足以下兩個條件時,您的應(yīng)用才能訪問其他應(yīng)用創(chuàng)建的文件:
1、 您的應(yīng)用已獲得 READ_EXTERNAL_STORAGE 權(quán)限。
2、這些文件位于以下其中一個明確定義的媒體集合中:
照片:存儲在 MediaStore.Images 中。
視頻:存儲在 MediaStore.Video 中。
音樂文件:存儲在 MediaStore.Audio 中。
任何其他文件(包括“downloads”目錄下的文件),必須使用存儲訪問框架
注意:訪問外部存儲設(shè)備中的文件時會進入過濾視圖的應(yīng)用不具有對 /sdcard/DCIM/IMG1024.JPG 等路徑的直接內(nèi)核訪問權(quán)限。要訪問此類文件,應(yīng)用必須使用 MediaStore.openFile() 等方法。
卸載后保留應(yīng)用的文件
文件存儲在應(yīng)用私有目錄下,在卸載該應(yīng)用后,系統(tǒng)會清除該應(yīng)用的目錄中的所有文件(有點類似Android/data/xxx目錄)。有時我們要在卸載后保留這些文件,請將其保存到 MediaStore 中的某個目錄下。
選擇停用分區(qū)存儲
在Android Q設(shè)備上有兩種方式來讓分區(qū)存儲生效:
- 以 Android 9 或更低版本為目標(biāo)平臺 (Target SDK <=28)
- 如果Target SDK > 28,請在manifest中添加android:requestLegacyExternalStorage=“true”
這樣就可以采用原有的存儲策略。以上方式不建議使用。
官方警告:明年,所有應(yīng)用的主要平臺版本都需要分區(qū)存儲,無論其采用哪種目標(biāo) SDK 級別。
文件訪問權(quán)限摘要
文件位置 | 所需權(quán)限 | 訪問方法 | 卸載時是否刪除文件 |
---|---|---|---|
應(yīng)用私有目錄 | 無 | getExternalFilesDir() | 是 |
媒體集合(照片、視頻、音頻) | READ_EXTERNAL_STORAGE(僅當(dāng)訪問其他應(yīng)用的文件時) | MediaStore | 否 |
下載內(nèi)容(文檔和電子書籍) | 無 | 存儲訪問框架(加載系統(tǒng)的文件選擇器 | 否 |
您可以使用存儲訪問框架訪問上表中顯示的每個位置,而無需請求任何權(quán)限。
特定文件訪問適配
分享媒體文件
如果你的應(yīng)用有分享照片和視頻需求。請使用 MediaStore存儲需要共享的文件。
如果您提供一組配套應(yīng)用(例如短信應(yīng)用和個人資料應(yīng)用),請使用 content:// URI 設(shè)置文件共享。已經(jīng)建議將此工作流作為一項安全最佳做法。
使用文檔
如果需要打開企業(yè)辦公文檔或打開另存為 EPUB 文件的圖書。
通過調(diào)用 ACTION_OPEN_DOCUMENT intent 能選擇要打開的文件, intent 會打開系統(tǒng)的文件選擇器應(yīng)用。顯示應(yīng)用所支持類型的文件,intent 中需要包含Intent.EXTRA_MIME_TYPES extra
GitHub 上的 ActionOpenDocument 示例說明了如何使用 ACTION_OPEN_DOCUMENT 打開文件。
訪問和修改媒體內(nèi)容
上面已經(jīng)介紹過了不再重復(fù),需要使用MediaStore
更新其他應(yīng)用的媒體文件
Android Q以前應(yīng)用都不太關(guān)注其它用戶組訪問應(yīng)用目錄權(quán)限,適配Android Q后你會接到廠商要求你限定用戶組訪問存儲目錄權(quán)限問題單。
要修改另一個應(yīng)用保存到外部存儲設(shè)備的給定媒體文件,請捕獲平臺拋出的 RecoverableSecurityException。然后,您可以請求用戶授予您的應(yīng)用對此特定內(nèi)容的寫入權(quán)限。
照片中的位置信息
我們拍攝的照片一般在Exif元數(shù)據(jù)中包含了位置信息,在Android Q 以前我們可以方便的獲取到圖片的位置信息,Android Q 會默認(rèn)對您的應(yīng)用隱藏此類信息。并且這種位置信息限制與適用于相機功能的限制不同。
如果您的應(yīng)用需要訪問照片的位置信息,請完成以下步驟:
將新的 ACCESS_MEDIA_LOCATION 權(quán)限添加到應(yīng)用清單中。
在 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普通應(yīng)用升級為系統(tǒng)應(yī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)文章
Android編程監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)改變的方法
這篇文章主要介紹了Android編程監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)改變的方法,基于BroadcastReceiver實現(xiàn)針對網(wǎng)絡(luò)連接狀態(tài)的監(jiān)聽功能,需要的朋友可以參考下2017-06-06Android開發(fā)之StackView用法和遇到的坑分析
這篇文章主要介紹了Android開發(fā)之StackView用法和遇到的坑,結(jié)合實例形式分析了Android StackView圖片操作用法及常見問題解決方法,需要的朋友可以參考下2019-03-03Android編程之監(jiān)聽器的實現(xiàn)方法
這篇文章主要介紹了Android編程之監(jiān)聽器的實現(xiàn)方法,以實例形式較為詳細(xì)的分析了Android監(jiān)聽器的創(chuàng)建、注冊及相關(guān)使用技巧,需要的朋友可以參考下2015-11-11Android Jetpack組件中LiveData的優(yōu)劣
LiveData是Jetpack組件的一部分,更多的時候是搭配ViewModel來使用,相對于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件(?Activity、Fragment、Service)處于活動生命周期狀態(tài)的時候才會更新數(shù)據(jù)2023-04-04