如何检测Android应用是否已获得「允许管理所有文件」权限
原因说明
MANAGE_EXTERNAL_STORAGE是Android 11(API等级30)新增的特殊文件管理权限,不属于普通运行时权限体系,因此无法使用ActivityCompat.checkSelfPermission方法检测授权状态,调用该方法检测该权限时系统会始终返回false,属于正常设计逻辑。
符合需求的检测函数
该函数完全匹配你提出的返回规则:选中「允许管理所有文件」时返回true,选中「仅允许访问媒体」「拒绝」时返回false。
Java版本
import android.os.Environment; import android.os.Build; import androidx.core.app.ActivityCompat; import android.content.pm.PackageManager; public boolean isFullStoragePermissionGranted() { // Android 11及以上版本使用官方专用API检测全文件管理权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return Environment.isExternalStorageManager(); } // 低于Android 11的版本无三类权限分级,可根据需求调整此处逻辑,示例为检测普通存储权限 else { return ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } }
Kotlin版本
import android.os.Environment import android.os.Build import androidx.core.content.ContextCompat import android.content.pm.PackageManager fun isFullStoragePermissionGranted(): Boolean { return when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { Environment.isExternalStorageManager() } else -> { ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED } } }
补充配置说明
如果你的应用需要兼容Android 10及更低版本,还需要在manifest.xml中补充配置普通存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
检测到未授权时可通过以下代码跳转至系统专属权限页引导用户开启:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + requireActivity().getPackageName())); startActivityForResult(intent, 1001); // 1001为自定义请求码 }
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

