AndroidQ适配之存储权限的变更

本文介绍了Android Q中存储权限的重大变更,包括独立的存储沙盒、共享目录的使用,以及如何在新系统下读写文件。Android Q不允许应用直接通过路径访问其他应用在公共目录下的文件,需要申请READ_EXTERNAL_STORAGE权限。同时,详细阐述了通过MediaStore进行文件操作的方法,以及如何在Android Q中使用Storage Access Framework(SAF)来实现文件的选择、创建和删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android10权限变更—分区存储
  1. androidQ的变更

    • 独立的存储沙盒:应用通过文件路径保存的文件都会被保存在应用的沙盒中,App卸载沙盒内的所有内容会被删除
    • 共享目录:有些文件譬如图片等,开发者不希望这些文件随着app的卸载被删除,可以将他们通过谷歌提供的MediaProvider或者SAF保存到共享目录中。
    • 权限:app读取自己沙盒和自己存放在公共目录下的文件是不需要申请任何权限的,但是如果app要读取其他应用创建的公共目录下的文件,是需要申请READ_EXTERNAL_STORAGE权限;系统只提供了读的权限,所以是无法通过申请写的权限修改其他应用创建的文件。
    • 路径问题:读取私有目录下的文件,可以直接使用文件的路径直接获取。应用和其他应用保存在共有目录的下的多媒体文件,都只能通过Media一些方法进行获取。通过路径方式是获取不到的。
  2. androidQ的存储结构示意图

  3. 向沙盒内写入文件

    建议将: 内部存储:/data/user/0/应用包名/files和内置外部存储:/storage/emulated/0/Android/data/应用包名/files作为沙盒。

    代码:

    /*
     * 将图片存到沙盒中,建议写到this.getExternalFilesDir(null)文件夹下
     * this.getFilesDir()所在的内存储空间有限,满了影响手机运行
     * */
    private void saveImageToBox(String fileName, Bitmap bitmap) {
    	final String ImagePath = "zwk";
    	try {
    		File PictureFile = this.getFilesDir(); // 内存储的私有目录中
            //File PictureFile = this.getExternalFilesDir(null); // 内置外存储的私有文件夹
    		File ImageFileDirectory = new File(PictureFile + File.separator + ImagePath);
    		if (ImageFileDirectory.exists()) {
    			File photoFile = new File(ImageFileDirectory + File.separator + fileName);
    			FileOutputStream fileOutputStream = new FileOutputStream(photoFile);
    			bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream);
    			fileOutputStream.flush();
    			fileOutputStream.close();
    
    		} else if (ImageFileDirectory.mkdir()) {
    			File photoFile = new File(ImageFileDirectory + File.separator + fileName);
    			FileOutputStream fileOutputStream = new FileOutputStream(photoFile);
    			bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream);
    			fileOutputStream.flush();
    			fileOutputStream.close();
    		}
    	} catch (Exception e) {
    		Log.d("zwk", "异常了");
    	}
    }
    
  4. 读写公共目录

    • 写入公共目录

      • 通过提供的ContentValues设置一些文件的信息;
      • getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)方法设置文件插入文件的Uri;
      • getContentResolver().openOutputStream(uri)和读取自己公共目录下创建的文件bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); 写入文件

    代码:

    /*
     *  将文件写入到公共目录中去,需要根据文件的类型,找到合适的Environment.DIRECTORY_xx路径
     *  如:图片可以放到Environment.DIRECTORY_PICTURES|Environment.DIRECTORY_DCIM中
     *  文件不同,使用的MediaStore.xx不同 
     *  如:图片需要使用MediaStore.Images.Media
     * 
     * */
    private void saveImageToPublic(String fileName, Bitmap bitmap) {
    
    	ContentValues contentValues = new ContentValues();
    	contentValues.put(MediaStore.Images.Media.DESCRIPTION, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值