在Android10的手机上已申请权限,仍报错open failed: EACCES (Permission denied),除了常规的权限申请,还要在Manifest文件中添加一句代码:
<application
android:requestLegacyExternalStorage="true"/>
下面是常规权限申请
private String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO};
// 未授予的权限存储到mPerrrmissionList中
private List<String> mPermissionList = new ArrayList<>();
// 获取录音、文件读写权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ActivityCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.size() > 0) {
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, 1);
} else {
// 权限得到
}
} else {
// 权限得到
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;//有权限没有通过
if (requestCode == 1) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
hasPermissionDismiss = true;
}
}
//如果有权限没有被允许
if (hasPermissionDismiss) {
// 有权限没有通过
showDialogTipUserGoToAppSettting();
} else {
// 权限申请成功
}
}
}
// 提示用户去应用设置界面手动开启权限
private void showDialogTipUserGoToAppSettting() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("权限申请").setMessage("请在-应用设置-权限-中,打开麦克风、存储权限,以便正常使用app")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到应用设置界面
goToAppSetting();
finish();
}
}).setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}
// 跳转到当前应用的设置界面
private void goToAppSetting() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 1);
}