在Manifest中添加:
在MainActivity中//android:requestLegacyExternalStorage="true"//此属性允许在设置中手动开启储存权限
private static final int RC_WRITE_AND_READ_EXTERNAL_STORAGE = 300;//识别码
@AfterPermissionGranted(RC_WRITE_AND_READ_EXTERNAL_STORAGE) //This is optional
private void requireWriteAndReadExternalStoragePermission() {
String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, perms)) {
// 已经拥有相关权限
init();//初始化操作
} else {
// 没有拥有权限,去获取
EasyPermissions.requestPermissions(this, getString(R.string.permissions),
RC_WRITE_AND_READ_EXTERNAL_STORAGE, perms);
}
}
重写和实现以下方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, List list) {
// 当权限授予后执行的操作
init();
}
@Override
public void onPermissionsDenied(int requestCode, List list) {
//当权限被拒绝后执行的操作
Toast.makeText(this, getString(R.string.permissions_error), Toast.LENGTH_SHORT).show();
//下面这个将显示一个直接去设置里开启权限的对话框
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this)
.setPositiveButton(R.string.authorize_msg)
.setTitle(R.string.authorize_title_msg)
.setRationale(R.string.modify_permission_msg)
.build()
.show();
}
}
private boolean hasExteralPermissions() {
String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
return EasyPermissions.hasPermissions(this, perms);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 从设置里返回后,对用户授予的权限进行判断
if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
if (hasExteralPermissions() ? true : false) {
init();
} else {
Toast.makeText(this, "权限获取失败,即将关闭应用", Toast.LENGTH_SHORT).show();
finish();//结束程序
}
}
if (requestCode == 0x99){
if (Environment.isExternalStorageManager() ? true : false) {
init();
} else {
finish();
Toast.makeText(this, "权限获取失败,即将关闭应用", Toast.LENGTH_SHORT).show();
}
}
}
注意Android 11 需要授予所有文件的管理权限, 否则不可以运行
在Manifest额外添加:
只需改良以上方法:
@AfterPermissionGranted(RC_WRITE_AND_READ_EXTERNAL_STORAGE) //This is optional
private void requireWriteAndReadExternalStoragePermission() {
String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
isManager();//修改这里! 如果是安卓11以上 获取文件管理者
} else {
// Do not have permissions, request them now
EasyPermissions.requestPermissions(this, getString(R.string.permissions),
RC_WRITE_AND_READ_EXTERNAL_STORAGE, perms);
}
}
//添加以下
public boolean gtSdk30() { //获取当前系统版本是否安卓11以上
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
}
//R = 安卓11,O = 8, M = 6
private void isManager() {
if (gtSdk30()) {
if (Environment.isExternalStorageManager()) init();
else getManager();
} else init();
}
private void getManager() {
alertDialog alertDialog;
alertDialog.Builder builder = new alertDialog.Builder(this, R.style.DialogStyle);//嫌麻烦,样式可设为null
builder.setPositiveButton(getString(R.string.authorize_msg), null);
builder.setTitle(getString(R.string.authorize_title_msg));
builder.setMessage(getString(R.string.file_manger_msg));
builder.setCancelable(false);
alertDialog = builder.create();
alertDialog.show();
alertDialog.getButton(alertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
alertDialog.dismiss();//去获取文件管理
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0x99);
});
}
所需Res资源
string
为了正常使用,需要以下权限!
未能获取到相关权限
点击前往授权
缺少必要权限
Android 11 需要授予所有文件的管理权限
应用不能正常运行,需要在设置里手动开启访问储存权限
theme



