时间:2021-05-21
前言
最近时间在做AndroidQ的适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上的帖子大部分都是概述变更内容,接下来的几篇帖子都是对分区存储实际经验代码总结,填坑经验,特此记录一下,也为大家提供帮助。
本篇主要是对AndroidQ(10)分区存储适配具体实现
这里需要注意:在适配AndroidQ的时候还要兼容Q系统版本以下的,使用SDK_VERSION区分
背景
存储权限
Android Q仍然使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE作为存储相关运行时权限,但现在即使获取了这些权限,访问外部存储也受到了限制,只能访问自身目录下的文件和公共内体文件。
外部存储结构划分
公有目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
地址:/storage/emulated/0/Downloads(Pictures)等
公有目录下的文件不会跟随APP卸载而删除。
APP私有目录
地址:/storage/emulated/0/Android/data/包名/files
私有目录存放app的私有文件,会随着App的卸载而删除。
适配指导
AndroidQ中使用ContentResolver进行文件的增删改查
1、获取(创建)自身目录下的文件夹
获取及创建,如果手机中没有对应的文件夹,则系统会自动生成
2、创建自身目录下的文件
生成需要下载的路径,通过输入输出流读取写入
3、创建公共目录下的文件夹
通过MediaStore.insert写入
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { return null;}ContentResolver resolver = context.getContentResolver();ContentValues values = new ContentValues();values.put(MediaStore.Downloads.DISPLAY_NAME, fileName);values.put(MediaStore.Downloads.DESCRIPTION, fileName);//设置文件类型values.put(MediaStore.Downloads.MIME_TYPE, "application/vnd.android.package-archive");//注意MediaStore.Downloads.RELATIVE_PATH需要targetVersion=29,//故该方法只可在Android10的手机上执行values.put(MediaStore.Downloads.RELATIVE_PATH, "Download" + File.separator + "apk");Uri external = MediaStore.Downloads.EXTERNAL_CONTENT_URI;Uri insertUri = resolver.insert(external, values);return insertUri;4、公共目录下的指定文件夹下创建文件
结合上面代码,我们主要是在公共目录下创建文件或文件夹拿到本地路径uri,不同的Uri,可以保存到不同的公共目录中。接下来使用输入输出流就可以写入文件
重点:AndroidQ中不支持file://类型访问文件,只能通过uri方式访问
ContentResolver resolver = context.getContentResolver();Uri insertUri = resolver.insert(external, values);if(insertUri == null) { return;}String mFilePath = insertUri.toString();InputStream is = null;OutputStream os = null;try { os = resolver.openOutputStream(insertUri); if(os == null){ return; } int read; File sourceFile = new File(sourcePath); if (sourceFile.exists()) { // 文件存在时 is = new FileInputStream(sourceFile); // 读入原文件 byte[] buffer = new byte[1024]; while ((read = is.read(buffer)) != -1) { os.write(buffer, 0, read); } }} catch (Exception e) { e.printStackTrace();}finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); }}5、通过MediaStore读取公共目录下的文件
6、使用MediaStore删除文件
7、APP通过MediaStore访问文件所需要的权限
header 1 无权限 READ_EXTERNAL Audio 可读写APP自己创建的文件,但不可直接使用路径访问 可以读其他APP创建的媒体类文件,删改操作需要用户授权 Image 可读写APP自己创建的文件,但不可直接使用路径访问 可以读其他APP创建的媒体类文件,删改操作需要用户授权 File 可读写APP自己创建的文件,但不可直接使用路径访问 不可读写其他APP创建的非媒体类文件 Downloads 可读写APP自己创建的文件,但不可直接使用路径访问 不可读写其他APP创建的非媒体类文件
后续对AndroidQ存储针对具体功能做介绍,欢迎关注~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
分区存储在AndroidQ中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。其他应用无法直接访问应用的沙盒文件。由于文件是应用的私有文
为了让用户更好地控制自己的文件,AndroidQ更改了应用访问设备外部存储空间中文件的方式。AndroidQ用更精细的媒体特定权限来替换READ_EXTERNA
常用的存储器地址空间有四种分配方式,分别是:连续分配方式、基本分页存储管理方式、基本分段存储管理方式、段页式存储管理方式。 地址空间(addressspace
以电视为例,遥控器语音功能不能用了的原因: 1、重新适配系统:蓝牙驱动和系统不兼容,一般出现在系统升级后。首先尝试重新适配,适配方法一般在说明书中有,因为不同
本文实例为大家分享了Android屏幕适配工具类的具体代码,供大家参考,具体内容如下DimenToolgithub地址Android屏幕适配方案,自动生成不同分