Android系统不同版本存储权限

Android系统不同版本存储权限Android 系统不同版本存储权限变更行为 android 存储权限

大家好,欢迎来到IT知识分享网。

一、Android存储简介

提醒:应用私有存储不需要动态申请权限

  1. Context.getFileDir();获取内置存储下的文件目录,可以用来保存不能公开给其他应用的一些敏感数据如用户个人信息。
    路径为:/data/data/应用包名/files/
  2. Context.getCacheDir();获取内置存储下的缓存目录,可以用来保存一些缓存文件如图片,当内置存储的空间不足时将系统自动被清除。
    路径为: /data/data/应用包名/cache/

点击查看数据和文件存储概览

二、Android系统不同版本访问存储权限

点击查看安全准则
点击查看Android中的权限
点击查看权限清单列表

2.1 Android 6.0

点击查看Android6.0 变更

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

2.2 Android 7.0

点击查看Android7.0变更

2.2.1 权限更改
2.2.1.1系统权限更改

为了提高私有文件的安全性,以 Android 7.0 或更高版本为目标平台的应用的私有目录限制了访问权限 (0700)。此设置可防止私有文件的元数据泄露,如其大小或存在。此权限更改具有多种副作用:

  1. 私有文件的文件权限不应再由所有者放宽,如果尝试使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 放宽文件权限,将会触发 SecurityException。
  2. 传递软件包网域外的 file:// URI 可能会给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。建议使用 FileProvider 来共享非公开文件的内容。
  3. DownloadManager 无法再按文件名分享私密存储的文件。旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能最终采用无法访问的路径。以 Android 7.0 或更高版本为目标平台的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException。使用 DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 将下载位置设置为公开位置的旧版应用仍然可以访问 COLUMN_LOCAL_FILENAME 中的路径,但我们强烈建议不要使用此方法。访问 DownloadManager 公开的文件的首选方法是使用 ContentResolver.openFileDescriptor()。
2.2.1.2在应用间共享文件
  1. 在res目录里定义xml文件,然后创建一个provider.xml文件,示例如下图
    在这里插入图片描述
  2. 在AndroidManifest.xml里添加provider配置信息,示例如下
    在这里插入图片描述

provider_paths.xml文件代码

<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="beta_external_path" path="Download/" /> <external-path name="beta_external_files_path" path="Android/data/" /> <external-path name="download" path="." /> <external-path name="sdcard_files" path="Android/data/com/exemple/app/images" /> <external-files-path name="camera_has_sdcard" path="Android/data/com/exemple/app/images" /> <files-path name="camera_no_sdcard" path="Android/data/com/exemple/app/other" /> <external-path name="files_root" path="Android/data/com/exemple/app" /> <external-path name="external_storage_root" path="." /> </paths> 

file_paths.xml文件

<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> ... </paths> 

自定义FileProvider
MyFileProvider.java代码

public class MyFileProvider extends FileProvider { 
    public MyFileProvider() { 
    super(R.xml.file_paths) } } 
<manifest> ... <application> ... <provider android:name="com.sample.MyFileProvider" android:authorities="com.mydomain.fileprovider" android:exported="false" android:grantUriPermissions="true"> ... </provider> ... </application> </manifest> 
2.2.2 从授权的URI获取文件
FileProvider.getUriForFile(@NonNull Context context, @NonNull String authority,@NonNull File file) { 
   } 
 File imagePath = new File(Context.getFilesDir(), "my_images"); File newFile = new File(imagePath, "default_image.jpg"); Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile); 

使用示例代码

public void takePicture() { 
    // Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Intent takePictureIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);// 打开系统相机连续拍多张图片 if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
    File cameraFile = FileUtils.createCameraFile(this); cameraPath = cameraFile.getAbsolutePath(); mUri = Uri.fromFile(new File(cameraPath)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(MainActivity.this, fileprovider, cameraFile)); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } else { 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri); } startActivityForResult(takePictureIntent, REQUEST_CODE_TAKEPICTURES); } } 

2.3 Android 8.0

点击查看Android 8.0 行为变更

2.4 Android 9.0

点击查看Android9.0 行为变更

2.5 Android 10.0

点击查看Android 10 中的隐私权变更

Android 10(API 级别 29)引入了多项功能和行为变更,以更好地保护用户隐私。这些变更让用户更清楚地了解并更好地控制其数据及为应用提供的功能。这些功能可能意味着,应用所依赖的特定行为或数据的行为方式可能与旧版平台不同。如果您的应用遵循当前处理用户数据的最佳实践,那么对应用的影响应该微乎其微。

2.5.1 外部存储访问权限范围限定为应用文件和媒体

默认情况下,以 Android 10 及更高版本为目标平台的应用在访问外部存储空间时被分区访问(即分区存储)。此类应用可以查看外部存储设备中的以下类型的文件,而无需请求任何与存储相关的用户权限:

  • 应用专属目录中的文件(使用 getExternalFilesDir() 访问)。
  • 应用创建的照片、视频和音频片段(通过媒体库访问)。

2.6 Android 11

点击查看Android 11 中的隐私权
点击查看Android 11 中的存储更新

2.6.1强制执行分区存储

在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用可以利用此标记暂时停用与分区存储相关的变更,例如授予对不同目录和不同类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。

2.6.2保持与 Android 10 的兼容性

如果应用在 Android 10 设备上运行时选择退出分区存储,建议您继续在应用的清单文件中将 requestLegacyExternalStorage 设为 true。这样,应用就可以在运行 Android 10 的设备上继续按预期运

2.6.3将数据迁移到使用分区存储时可见的目录

如果您的应用使用旧版存储模型且之前以 Android 10 或更低版本为目标平台,您可能会将数据存储到启用分区存储模型后您的应用无法访问的目录中。在以 Android 11 为目标平台之前,请将数据迁移到与分区存储兼容的目录。

2.6.4权限
  • 存储运行时权限已重命名为文件和媒体。
  • 如果您的应用未停用分区存储并且请求 READ_EXTERNAL_STORAGE 权限,用户会看到不同于 Android 10 的对话框。该对话框表明您的应用正在请求访问照片和媒体,如图 下图 所示。
    在这里插入图片描述
    用户可以在系统设置中查看哪些应用具有 READ_EXTERNAL_STORAGE 权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具有该权限的每个应用都列在允许存储所有文件下。如果您的应用以 Android 11 为目标平台,请记住,对“所有文件”的这种访问权限是只读访问权限。如需使用此应用读取和写入共享的存储空间中的所有文件,需要具有所有文件访问权限。

以 Android 11 为目标平台

所有文件访问权限

绝大多数需要共享存储空间访问权限的应用都可以遵循共享媒体文件和共享非媒体文件方面的最佳做法。但是,某些应用的核心用例需要广泛访问设备上的文件,但无法采用注重隐私保护的存储最佳做法高效地完成这些操作。对于这些情况,Android 提供了一种名为“所有文件访问权限”的特殊应用访问权限。如需了解详情,请参阅有关如何管理存储设备上的所有文件的指南。

注意 :如果您要将应用发布到 Google Play,请仔细阅读通知。如果您的应用以 Android 11 为目标平台并声明了所有文件访问权限,那么您在 Google Play 上发布和更新应用会受到影响。

2.7 Android 12

点击查看Android 12行为变更:所有应用
性能

2.7.1 受限应用待机模式存储分区

Android 11(API 级别 30)引入了受限存储分区作为应用待机模式存储分区。从 Android 12 开始,此存储分区默认处于活跃状态。在所有存储分区中,受限存储分区的优先级最低(限制最高)。存储分区按优先级从高到低的顺序排列如下:

  1. 活跃:应用目前正在使用中,或者最近刚刚使用过。
  2. 工作集:会定期使用应用。
  3. 常用:会经常使用应用,但不是每天都使用。
  4. 极少使用:不经常使用应用。
  5. 受限:应用会消耗大量的系统资源,或表现出不良行为。
2.7.2 检查您的应用是否在受限存储分区中

如需检查系统是否已将您的应用放在受限存储分区中,请调用 getAppStandbyBucket()。如果此方法的返回值为 STANDBY_BUCKET_RESTRICTED,则您的应用在受限存储分区中。

2.8 Android 13

点击查看Android 13行为变更:所有应用
点击查看Android 13 功能和变更列表

2.9 Android 14

点击查看Android 14 功能和变更列表
点击查看点击查看Android 14 行为变更:所有应用

2.10 Android 15

点击查看Android 15 功能和变更列表
点击查看Android 15 行为变更:所有应用

三、推荐阅读

Android存储文件路径的区别

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111115.html

(0)
上一篇 2026-01-27 07:33
下一篇 2026-01-27 08:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信