今天遇到的问题,在AndroidMainfest.xml添加了写文件权限还是提示open failed:eacces (permission denied)
查找了很久才发现原来是下面的原因:(原因为转载,红字为自己添加注释)
For API 23+ you need to request the read/write permissions even if they are already in your manifest.
因为在API23以上版本,你必须请求读写权限,即使你在清单文件里声明了。
和声明各组件一样,先在MainActivity里声明如下代码
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
接着在调用更新代码处添加如下方法即可。
用AndroidStudio开发:
int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
MainActivity.this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
使用旧的eclipse的话:
int permission = OperateQuestionnairActivity.this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
OperateQuestionnairActivity.this.requestPermissions(
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
申请多条权限:
1.声明变量:
// 权限
private static final int REQUEST_PERMISSION = 1;
private static String[] PERMISSIONS = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.INTERNET,
Manifest.permission.VIBRATE,
Manifest.permission.CAMERA,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS,
Manifest.permission.RECEIVE_BOOT_COMPLETED,
Manifest.permission.WAKE_LOCK,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_LOGS
};
2.onCreate里调用:
/**
* 初始化权限
*/
private void initPermission() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
boolean isGranted = true;
for (String permission : PERMISSIONS) {
int result = ActivityCompat.checkSelfPermission(this, permission);
if (result != PackageManager.PERMISSION_GRANTED) {
isGranted = false;
break;
}
}
if (!isGranted) {
// 还没有的话,去申请权限
ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSION);
}
}
}
3.回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
boolean granted = true;
for (int result : grantResults) {
granted = result == PackageManager.PERMISSION_GRANTED;
if (!granted) {
break;
}
}
if (!granted) {
// 没有赋予权限
} else {
// 已经赋予过权限了
}
}
}
另:安卓M以上版本,如果你在Activity申请了Manifest没有声明的权限,那么将不会弹出权限请求的对话框,直接返回-1(权限拒绝);如果你在Manifest声明了,但没有在Activity里申请就直接使用特殊的权限,应用将直接闪退。