关于android开发中,sd卡的读写权限的处理步骤和踩坑
1版本说明
在 Android 10(API 级别 29)及以下版本中,申请权限可以使用WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限请求文件存储权限。但从 Android 11(API 级别 30)开始,Google引入了一种新的管理存储权限机制,用于处理所有文件访问。对于这种情况,你需要使用 MANAGE_EXTERNAL_STORAGE 权限。
以下是如何在 AndroidManifest.xml 中设置当前私有方法 requestPermission 所涉及的权限:
AndroidManifest.xml 配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<!-- 其他元素,例如 application 及其下属元素 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Android 11 (API 级别 30)及以上版本访问所有文件的权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!-- 在安卓系统中请求写入和读取外部存储的权限(针对 Android 10 及以下版本) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
同时,也需要在代码中动态申请权限。比如在Activity中。代码如下:
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//30
if (!Environment.isExternalStorageManager()) {
//跳转到设置界面引导用户打开
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, PERMISSIONS_REQUEST_CODE);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PERMISSIONS_REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
Log.d(TAG, "onActivityResult: permission success");
} else {
Toast.makeText(this, "存储权限获取失败", Toast.LENGTH_SHORT).show();
}
}
}
}