AndroidQ适配之存储权限的变更

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, 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 9.0中,动态申请存储权限是必须的,以提高应用程序的安全性和隐私保护。以下是如何在Android 9.0中动态申请存储权限的步骤: 1. 在AndroidManifest.xml文件中添加存储权限的声明。 ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 检查应用程序是否已经被授予存储权限。可以使用`checkSelfPermission`方法进行检查,并在需要的情况下请求授予权限。 ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 未获得存储权限,进行权限请求 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } else { // 已获得存储权限,执行相应操作 // do something } ``` 3. 实现`onRequestPermissionsResult`方法,处理用户对权限请求的响应。如果用户授予了权限,可以继续执行相关操作。 ```java @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == requestCode) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户授予了存储权限,执行相应操作 // do something } else { // 用户拒绝了存储权限,可以向用户解释为什么需要该权限 } } } ``` 需要注意的是,在Android 9.0之后,需要在`AndroidManifest.xml`文件中进行权限声明,同时还需要在运行时动态请求权限。这样做可以提高用户对应用程序的信任,同时保护用户的隐私和数据安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值