电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解Android10的分區存儲機制(Scoped Storage)適配教程

瀏覽:6日期:2022-09-24 10:30:38

1. 簡介

大家應該都有過這樣的體會,手機用著用著里面就充斥著各種不懂的文件夾和文件。甚至是連已經刪除的軟件的文件夾還存在。

為什么會發生的這樣的問題呢?

因為Google的缺席,導致Android生態野蠻生長,導致很多開發規范沒有完全被落實。為了解決這樣的問題,Google決定重拳出擊,提出了分區存儲(Scoped Storage)機制,也叫沙盒存儲機制。那么什么是沙盒存儲機制呢。沙盒機制是一種安全機制,用于防止應用讀取其他應用的數據。

每個應用程序都有自己的存儲空間。 應用程序不能翻過自己的目錄,去訪問公共目錄。 應用程序請求的數據都要通過權限檢測,不符合要求不會被放行。

2. 關于Android10的分區機制

詳解Android10的分區存儲機制(Scoped Storage)適配教程

以 Android 10(API 級別 29)及更高版本為目標平臺的應用在默認情況下被賦予了對外部存儲設備的分區訪問權限(即分區存儲), 對外部存儲文件訪問方式重新設計,便于用戶更好的管理外部存儲文件。如果不符合條件的會以兼容模式運行,兼容模式跟以前一樣,根據路徑可以直接存儲文件。

應用只能看到本應用專有的目錄(通過 Context.getExternalFilesDir() 訪問)以及特定類型的媒體。除非您的應用需要訪問存放在應用的專有目錄以及 MediaStore 之外的文件,否則最好使用分區存儲。在發布Android10的時候官方明確表態:

2020年,主要平臺版本將要求所有應用都使用分區存儲,無論應用的目標 SDK 級別是多少。因此,您應該提前確保您的應用能夠使用分區存儲。為此,請確保針對搭載 Android 10(API 級別 29)及更高版本的設備啟用了該行為。翻譯成通俗語言,不管是使用requestLegacyExternalStorage=true的方式以兼容模式運行還是降低targetSDK都無法在接下來2020年的Android(API 29)10更新中被豁免。

所以為了應用的穩定性,應該盡在進行適配。

3. 具體分區存儲權限的介紹

默認情況下,對于targetSdkVersion大于等于29的應用,其訪問權限范圍限定為分區存儲。此應用無需請求與存儲相關的用戶權限,即可以查看外部存儲中以下類型的文件:

應用外部特定目錄中的文件(使用getExternalFilesDir()訪問)。 應用自己創建的照片、視頻和音頻(通過MediaStore訪問)。

分區存儲將影響在Android10系統首次安裝啟動、且targetSdkVersion >=29的應用。需要訪問和共享外部存儲文件的應用會受到影響,需要進行兼容性適配。

影響范圍:在Android 10上運行的應用:1.targetSdkVersion <= 28,不受影響2.如果targetSdkVersion >= 29,默認情況應用外部存儲可見性將被過濾,應用需要對分區存儲進行適配。

還有值得注意的是以下兩種情況比較特殊,不會受到分區存儲的影響:

如果應用最先安裝在Android 10以下的系統,1) 然后系統通過Fota升級到Android 102) 應用通過更新升級到targetSdkVersion >= 29

下面是關于分區存儲權限和其他相關項目的表格。

類型 位置 訪問應用自己生成的文件 訪問其他應用生成的的文件 訪問方法 卸載應用是否刪除文件 外部存儲 Photo/ Video/ Audio/ 無需權限 需要權限READ_EXTERNAL_STORAGE MediaStore Api 否 外部存儲 Downloads 無需權限 無需權限 通過存儲訪問框架SAF,加載系統文件選擇器 否 外部存儲 應用特定的目錄 無需權限 無法直接訪問 getExternalFilesDir()獲取到屬于應用自己的文件路徑 是

4. 專有目錄存儲

應用讀取或寫入應有專有的目錄中的文件時,不需要獲取存儲權限。在應用中想要獲取當前應用的專有存儲目錄路徑是可以用Context.getExternalFilesDir()的方式獲取。

val dirpath = context.getExternalFilesDir('')val fileString = dirpath + File.separatorval file = File(fileString)... // 剩下的步驟是用Java IO或者其他IO庫來寫入數據

5. 共享媒體集合存儲

在共享媒體集合存儲中保存媒體文件時,需要根據文件的類型選擇MediaStore。

把相關數據放入到ContentValues中,最后把ContentValues插入到ContentResolver中,并獲得返回的Uri。

通過Uri過得OutputStream,然后用Okio的IO庫,進行文件的存儲。

關于Okio的只是以后有機會的話,我們再好好講一講。

不要忘了這里需要獲取權限。

// 把圖片下載到共有媒體集合中,并在相冊中顯示// 創建ContentValues, 并加入信息val values = ContentValues()values.put(MediaStore.Images.Media.DESCRIPTION, downloadedFile.name)values.put(MediaStore.Images.Media.DISPLAY_NAME, downloadedFile.name)values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)values.put(MediaStore.Images.Media.TITLE, downloadedFile.name)values.put( MediaStore.Images.Media.RELATIVE_PATH, '${Environment.DIRECTORY_PICTURES}/${downloadedFile.name}')// 插入到ContentResolver,并返回Urival insertUri = context.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)if (insertUri != null) { // 獲取OutputStream val outputStream = context.contentResolver.openOutputStream(insertUri)if (outputStream != null) { sink = outputStream.sink().buffer()} else { return@runCatching FileDownloadResult.OthersError }} else { return@runCatching FileDownloadResult.OthersError} val responseBody = response.body ?: return@runCatching FileDownloadResult.OthersErrortry { val contentLength = responseBody.contentLength() if (contentLength > FileUtil.getAvailableSize(dirPath)) { continuation.resume(FileDownloadResult.StorageError) } var totalRead: Long = 0 var lastRead: Long do { lastRead = responseBody.source().read(sink.buffer(), BUFFER_SIZE) if (lastRead == -1L) { break } totalRead += lastRead sink.emitCompleteSegments() } while (true) sink.writeAll(responseBody.source()) sink.close() responseBody.close()}

6. 其他

Github: https://github.com/HyejeanMOON/ScopedStorageDemo

到此這篇關于詳解Android10的分區存儲機制(Scoped Storage)適配教程的文章就介紹到這了,更多相關Android10 分區存儲機制內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 神马影院-实时更新秒播 | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 技德应用| 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 |