Android 7 外部存储权限实现教程

1. 整体流程

在 Android 7(API level 24)及以上的版本中,访问外部存储(如 SD 卡)需要获取运行时权限。下面是实现 Android 7 外部存储权限的整体流程:

步骤 描述
步骤1 在 AndroidManifest.xml 文件中添加相应的权限声明
步骤2 在 Java 代码中检查是否已获得外部存储权限
步骤3 如果未获得权限,请求用户授权
步骤4 处理权限授权结果
步骤5 在代码中访问外部存储

下面将详细介绍每一步的具体操作。

2. 步骤1:权限声明

在 AndroidManifest.xml 文件中添加以下权限声明:

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

这样就声明了读写外部存储的权限。系统会在应用安装时提示用户授予这些权限。

3. 步骤2:检查权限状态

在需要访问外部存储的代码中,先检查是否已获得相应权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        == PackageManager.PERMISSION_GRANTED) {
    // 已获得权限,可以访问外部存储
} else {
    // 未获得权限,需要请求用户授权
}

上述代码中,this 表示当前的上下文对象。ContextCompat.checkSelfPermission() 方法用于检查应用是否具有指定的权限,返回值为 PackageManager.PERMISSION_GRANTED 表示已获得权限,否则需要请求用户授权。

4. 步骤3:请求用户授权

如果未获得外部存储权限,需要请求用户授权。可以使用 ActivityCompat.requestPermissions() 方法请求授权:

ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
        REQUEST_CODE);

上述代码中,this 表示当前的上下文对象,Manifest.permission.WRITE_EXTERNAL_STORAGE 表示请求的权限,REQUEST_CODE 是一个整数值,用于标识此次请求。

5. 步骤4:处理权限授权结果

在对话框中向用户请求权限后,系统会调用 onRequestPermissionsResult() 方法返回授权结果。可以在该方法中处理授权结果:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予了权限,可以访问外部存储
        } else {
            // 用户拒绝了权限,无法访问外部存储
        }
    }
}

上述代码中,requestCode 是之前请求权限时传递的值,grantResults[0] 表示授权结果,PackageManager.PERMISSION_GRANTED 表示用户授予了权限。

6. 步骤5:访问外部存储

如果用户授予了权限,就可以在代码中访问外部存储了。例如,可以使用 Environment.getExternalStorageDirectory() 方法获取外部存储的路径:

File storageDir = Environment.getExternalStorageDirectory();

上述代码中,storageDir 表示外部存储的路径。

结尾

通过以上步骤,你可以成功实现 Android 7 及以上版本的外部存储权限控制。首先,在 AndroidManifest.xml 文件中添加权限声明;然后,在代码中检查是否已获得权限,如果未获得则请求用户授权;最后,处理授权结果并在代码中访问外部存储。希望本文对你有所帮助!