You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中SDK21-32获取READ_EXTERNAL_STORAGE运行时权限的最新方法

针对SDK 21-32获取READ_EXTERNAL_STORAGE权限的原生实现方案

1. 清单文件声明权限

首先在AndroidManifest.xml中添加权限声明:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 若需要写入操作,可添加以下权限(仅适用于SDK32及以下) -->
<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> -->

2. 运行时权限请求逻辑(SDK23+适用)

SDK 21-22无需运行时请求,仅需清单声明即可;SDK23及以上必须通过代码动态申请权限,具体实现如下:

步骤1:检查权限状态

在MainActivity.java中实现权限检查方法:

private static final int REQUEST_READ_STORAGE = 101;

private boolean checkReadStoragePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
    }
    // SDK22及以下默认已授权
    return true;
}

步骤2:发起权限请求

若未获取权限,调用以下方法发起请求:

private void requestReadStoragePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_READ_STORAGE);
    }
}

步骤3:处理权限回调结果

重写onRequestPermissionsResult方法,处理用户的授权选择:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_READ_STORAGE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予,执行文件读取逻辑
            performFileReadOperation();
        } else {
            // 权限被拒绝,提示用户或处理无权限场景
            Toast.makeText(this, "需要读取存储权限才能继续操作", Toast.LENGTH_SHORT).show();
            // 若用户勾选"不再询问",引导至应用设置页开启权限
            if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                openAppSettings();
            }
        }
    }
}

// 引导至应用设置页的方法
private void openAppSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

步骤4:初始化调用

在Activity的合适时机(如onCreate)触发权限检查与请求:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (checkReadStoragePermission()) {
        // 已有权限,直接执行文件读取操作
        performFileReadOperation();
    } else {
        // 请求权限
        requestReadStoragePermission();
    }
}

// 示例:文件读取操作方法
private void performFileReadOperation() {
    // 此处编写你的外部存储读取逻辑
}

3. 额外注意事项

  • SDK21-22版本:无需运行时权限请求,清单声明后即可直接访问外部存储;
  • 权限拒绝后的体验优化:若用户拒绝并勾选"不再询问",需引导用户到应用设置页手动开启权限,避免功能完全不可用。

内容的提问来源于stack exchange,提问作者Marfog509

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:35:18