当前位置:首页 > 行业动态 > 正文

Android存储权限是如何工作的?

Android 11更新了存储权限,限制访问公共目录,需通过Storage Access Framework API选取文件。

Android存储权限详解

Android存储权限是如何工作的?  第1张

一、Android存储权限

在Android操作系统中,存储权限是应用与设备存储交互的基础,随着Android版本的更新,Google对存储权限的管理进行了多次优化和调整,以增强用户体验和数据安全,从Android 6.0(API级别23)开始,存储权限被标记为危险权限,需要在运行时动态申请,而到了Android 11(API级别30),Google引入了分区存储机制,进一步加强了对存储权限的控制。

二、Android 10及以前的存储权限管理

权限声明

在AndroidManifest.xml文件中声明所需权限:

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

动态申请权限

从Android 6.0(API级别23)开始,应用需要在代码中动态申请危险权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}

处理权限请求结果

覆盖onRequestPermissionsResult方法处理用户响应:

@Override
public void onRequestPermissionsResult(int requestCode, 
        @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0 
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予
            } else {
                // 权限被拒绝
            }
            return;
        }
    }
}

特殊注意事项

对于targetSdkVersion大于等于29的应用,还需要在AndroidManifest.xml中添加:

<application
        ...
        android:requestLegacyExternalStorage="true">
</application>

否则在Android 10设备上可能无法正常访问外部存储。

三、Android 11及以后的存储权限管理

分区存储

Android 11引入了分区存储机制,将存储分为应用专属存储区和公共共享存储区,应用默认只能访问自己的专属存储区,不能直接访问其他应用的数据。

新权限声明

除了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,还需要声明MANAGE_EXTERNAL_STORAGE权限:

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

3. 动态申请MANAGE_EXTERNAL_STORAGE权限

由于MANAGE_EXTERNAL_STORAGE属于特殊权限,需要通过系统设置页面进行授权:

if (!Environment.isExternalStorageManager()) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE);
}

使用存储访问框架(SAF)

为了向后兼容,Android 11建议使用Storage Access Framework来访问公共存储中的文件,通过系统文件选择器让用户选择文件:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE_REQUEST);

处理分区存储的文件路径变化

Android 11中,应用专属存储路径发生变化,可以通过以下方式获取:

Context context = getApplicationContext();
File dir = context.getExternalFilesDir(null);
File file = new File(dir, "example.txt");

四、归纳

Android的存储权限管理经历了从宽泛到严格的过程,体现了对用户隐私和数据安全的日益重视,开发者应紧跟Android版本更新,合理申请和使用存储权限,确保应用兼容性的同时保护用户数据安全,在实际开发中,建议采用分区存储的最佳实践,优先使用应用专属目录,必要时才通过存储访问框架访问公共存储,以提供更流畅、更安全的用户体验。

0