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

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

Android存储权限详解

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

一、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方法处理用户响应:

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

@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权限

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

由于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版本更新,合理申请和使用存储权限,确保应用兼容性的同时保护用户数据安全,在实际开发中,建议采用分区存储的最佳实践,优先使用应用专属目录,必要时才通过存储访问框架访问公共存储,以提供更流畅、更安全的用户体验。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1271044.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希新媒体运营
上一篇 2024-11-08 10:25
下一篇 2024-11-08 10:28

相关推荐

  • 服务器是如何分配管理员权限的?

    服务器管理员权限分配是一个复杂但至关重要的过程,它涉及到多个层面和步骤,以下是一个详细的指南,包括如何为不同角色分配适当的权限:一、了解权限分类在开始分配权限之前,首先需要了解网站或系统的权限分类,权限可以分为以下几个层级:1、超级管理员:拥有最高权限,可以对网站的所有功能进行操作和管理,包括用户管理、内容发布……

    2024-12-18
    08
  • 如何在GaussDB(for MySQL)中创建数据库并为用户授权使用?

    MySQL中创建数据库并使用GaussDB(for MySQL)创建用户并授权的步骤如下:,,1. 创建数据库:,“sql,CREATE DATABASE mydatabase;,`,,2. 切换到新创建的数据库:,`sql,USE mydatabase;,`,,3. 创建用户并授予权限:,`sql,CREATE USER ‘newuser’@’localhost’ IDENTIFIED BY ‘password’;,GRANT ALL PRIVILEGES ON mydatabase.* TO ‘newuser’@’localhost’;,FLUSH PRIVILEGES;,`,,以上命令将创建一个名为mydatabase的数据库,然后创建一个名为newuser`的用户,并将其授权为该数据库的所有权限。

    2024-12-15
    05
  • 如何创建存储过程权限?

    在数据库中,创建存储过程的权限通常由数据库管理员(DBA)或具有相应权限的用户授予。

    2024-12-14
    05
  • 如何创建数据表并进行用户授权?

    创建数据表及用户授权是数据库管理中的重要步骤。使用CREATE TABLE语句定义表结构;通过GRANT命令为用户分配相应的权限,确保数据安全和访问控制。

    2024-12-14
    07

发表回复

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

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入