您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Android 10中怎么實現分區存儲,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1. 分區存儲背景介紹
Google于 2019年9月3日發布了Android10 release版本,為了更好的保護用戶數據并限制設備冗余文件增加,Android 10版本變更了設備外部存儲訪問方式,外部存儲新特性稱為分區存儲(Scoped Storage), 分區存儲遵循以下三個原則對外部存儲文件訪問方式重新設計,便于用戶更好的管理外部存儲文件
1.1 文件更好的歸屬:
系統記錄文件由哪個應用創建,應用不需要存儲權限即可以訪問應用自己創建文件
1.2 應用數據保護:
添加外部存儲應用私有目錄文件訪問限制, 應用即使申請了存儲權限也不能訪問其他應用外部存儲私有目錄文件
1.3 用戶數據保護:
添加pdf、office、doc等文件的訪問限制,用戶即使申請了存儲權限也不能訪問其他應用創建的pdf、office、doc等文件
2. 應用兼容模式
分區存儲存在一定的適配成本,Google為Android10版本提供了過渡方案,設置應用以兼容模式運行(詳見2.3), Android11將不再支持該行為, 各應用需要在Android11發版之前完成分區存儲適配工作
1. 分區存儲概覽
1.1 分區存儲新特性對外部存儲進行了重新設計,外部存儲被分為應用私有目錄以及共享目錄兩個部分
(1)應用私有目錄:存儲應用私有數據,外部存儲應用私有目錄對應Android/data/packagename,內部存儲應用私有目錄對應data/data/packagename;
(2) 共享目錄:存儲其他應用可訪問文件, 包含媒體文件、文檔文件以及其他文件,對應設備DCIM、Pictures、Alarms, Music, Notifications,Podcasts, Ringtones、Movies、Download等目錄
1.2 應用私有目錄文件訪問
應用私有目錄文件訪問方式與之前Android版本一致,可以通過file path獲取資源
1.3 共享目錄文件訪問
共享目錄文件需要通過MediaStore API或者Storage Access Framework方式訪問
(1)MediaStore API在共享目錄指定目錄下創建文件或者訪問應用自己創建文件,不需要申請存儲權限
(2)MediaStore API訪問其他應用在共享目錄創建的媒體文件(圖片、音頻、視頻), 需要申請存儲權限,未申請存儲權限,通過ContentResolver查詢不到文件Uri,即使通過其他方式獲取到文件Uri,讀取或創建文件會拋出異常;
(3)MediaStore API不能夠訪問其他應用創建的非媒體文件(pdf、office、doc、txt等), 只能夠通過Storage Access Framework方式訪問;
1.4 其他受影響變更
(1) 圖片位置信息 一些圖片會包含位置信息,因為位置對于用戶屬于敏感信息, Android 10應用在分區存儲模式下圖片位置信息默認獲取不到,應用通過以下兩項設置可以獲取圖片位置信息,在manifest中申請ACCESS_MEDIA_LOCATION調用MediaStore setRequireOriginal(Uri uri)接口更新圖片Uri
(2) MediaStore.Files應用分區存儲模式下,MediaStore.Files 集合只能夠獲取媒體文件信息(圖片、音頻、視頻), 獲取不到非media(pdf、office、doc、txt等)文件
(3) File Path路徑訪問受影響接口
開啟分區存儲新特性, Andrioid 10不能夠通過File Path路徑直接訪問共享目錄下資源,以下接口通過File 路徑操作文件資源,功能會受到影響,應用需要使用MediaStore或者SAF方式訪問
2. 存儲特性Android版本差異概覽
3. 兼容模式
3.1 兼容模式設置
應用未完成外部存儲適配工作,可以臨時以兼容模式運行, 兼容模式下應用申請存儲權限,即可擁有外部存儲完整目錄訪問權限,通過Android10之前文件訪問方式運行,以下兩種方法設置應用以兼容模式運行
(1)Target 小于等于Android 9 (API level 28)
(2)Tagret 大于等于Android 10(API level 29), 在manifest中設置requestLegacyExternalStorage屬性為true
<manifest ... > <!-- This attribute is "false">
3.2 判斷兼容模式接口
Environment.isExternalStorageLegacy()
返回值
true : 應用以兼容模式運行
false:應用以分區存儲特性運行
丨備注
應用已完成存儲適配工作且已打開分區存儲開關,如果當前應用以兼容模式運行,覆蓋安裝后應用仍然會以兼容模式運行,卸載重新安裝應用才會以分區存儲模式運行
1. 分區存儲適配方案概覽
分區存儲適配包含文件遷移以及文件訪問兼容性適配兩個部分;
1.1 文件遷移
文件遷移是將應用共享目錄文件遷移到應用私有目錄或者Android10要求的media集合目錄
(1)針對只有應用自己訪問并且應用卸載后允許刪除的文件,需要遷移文件到應用私有目錄文件,可以通過File path方式訪問文件資源,降低適配成本
(2)允許其他應用訪問,并且應用卸載后不允許刪除的文件,文件需要存儲在共享目錄,應用可以選擇是否進行目錄整改,將文件遷移到Android10要求的media集合目錄
1.2 文件訪問兼容性適配
共享目錄文件不能夠通過File path方式讀取,需要使用MediaStore API或者Storage Access Framework框架進行訪問
2. 分區存儲適配指導
2.1 MediaStore API介紹
2.1.1 MediaStore API簡述
系統會自動掃描外部存儲,添加文件到系統已定義的Images、Videos、Audio files、Downloaded files集合中,Android 10通過MediaStore.Images、MediaStore.Video、MediaStore.Audio、MediaStore.Downloads 訪問共享目錄文件資源
2.1.2 MediaStore API創建文件
Android 10版本 MeidaStore API只允許在共享目錄指定目錄創建文件, 非指定目錄創建文件會拋出IllegalArgumentException, 創建文件目錄匯總如下:
丨備注
MediaStore.Downloads.EXTERNAL_CONTENT_URI是Android10版本新增API,用于創建、訪問非媒體文件;
2.1.3 不同存儲權限MediaStore API可訪問文件區域
2.1.4 MediaStore API 文件訪問
2.2 Storage Access Framework介紹
Android 4.4引入了Storage Access Framework框架,應用通過系統選擇器訪問 DocumentsProvider 提供文件(包含外部存儲以及云端存儲, 外部存儲包含應用私有目錄以及共享目錄), SAF機制不需要申請任何存儲權限, 包含Document provider、Client app、Picker三部分 :
(1)Document provider:文檔提供者是 DocumentsProvider 子類,數據模型是基于文件層級進行設計的,文檔提供者通過存儲服務(例如Google Drive)管理文件
(2)Client app:通過調用 ACTION_CREATE_DOCUMENT , ACTION_OPEN_DOCUMENT , and ACTION_OPEN_DOCUMENT_TREE Intent獲取Document provider提供的文件, 應用可以設置MIME type或者EXTRA_INITIAL_URI選擇需要獲取的文件,onActivityResult接口會返回選擇文件Uri
(3)Picker:系統UI,應用通過調起系統選擇器獲取Document provider提供的文件信息
2.3 分享場景適配
(1) APP主動分享文件給其他應用,可以使用FileProvider方式賦予其他應用文件讀取權限, FileProvider 應用基于XML配置生成文件Uri,其他應用不需要申請存儲權限就可以通過接收Uri獲取文件資源;
(2) Android 10 應用開啟分區存儲,通過File協議Uri或者MediaStore Uri分享文件給其他應用, 功能會受到影響, 具體如下表格:
1. 百度APP適配簡述
百度APP分區存儲適配涉及二十多業務方,歷經3個版本迭代,解決90%場景問題,排查外部存儲共享目錄通過File方式訪問的資源,針對歷史遺留文件, 業務方根據具體場景選擇是否進行文件遷移;針對只有應用自己訪問并且應用卸載后允許刪除的文件,通過文件遷移到外部存儲私有目錄方式進行適配;針對允許其他應用訪問,并且應用卸載后不允許刪除的文件, 通過使用MediaStore API或者SAF方式進行適配
2. 百度APP業務方適配匯總
看完上述內容,你們對Android 10中怎么實現分區存儲有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。