声明所需权限
在AndroidManifest中声明所需权限
要注意的是动态申请权限的时候申请一个会申请整个权限组,但是在声明的时候不会,读写权限需要分开声明
所需权限列表
String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
检查是否拥有权限并申请
if (checkPermissions(permissions)) {
openAlbum();
}
private boolean checkPermissions(String[] permissions) {
boolean havePermission = true;
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
havePermission = false;
ActivityCompat.requestPermissions(this, permissions, READ_EXTERNAL_STORAGE);
}
}
return havePermission;
}
权限申请事件的回调
判断弹出权限申请对话框后用户是否同意的情况,如果拒绝并且不再提示,需要将用户引导至设置页面自行提供权限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case READ_EXTERNAL_STORAGE:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum();
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, "您已拒绝提供权限,如需使用该功能需要在设置里为本应用提供相应权限", Toast.LENGTH_SHORT).show();
startActivity(getAppDetailSettingIntent());
}
break;
}
}
设置页面的Intent
若用户拒绝提供权限并选择不再提示,则需要将界面跳转至相应设置界面,让用户自己提供权限
private Intent getAppDetailSettingIntent() {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
return localIntent;
}