您的位置:首页 > 移动开发 > Android开发

在AndroidMainfest.xml添加了写文件权限还是提示open failed:eacces (permission denied)

2016-11-01 12:09 519 查看
For API 23+ you need to request the read/write permissions even if they are already in your manifest.

因为在API23以上版本,你必须请求读写权限,即使你在清单文件里声明了。

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里申请就直接使用特殊的权限,应用将直接闪退。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  eacces