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
相关产品推荐
相关产品推荐

