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