我们知道Android的权限需要在 manifest 文件中声明,但是仅仅这样并不能确保应用能够拥有声明的权限。
在Android 6.0以上的系统,我们可以通过动态权限,来获取是否拥有某一权限,也可以动态申请权限。
private void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; // 选择你需要申请的权限
for (int i = 0; i < permissions.length; i++) {
int state = ContextCompat.checkSelfPermission(this, permissions[i]);
if (state != PackageManager.PERMISSION_GRANTED) { // 判断权限的状态
ActivityCompat.requestPermissions(this, permissions, 200); // 申请权限
return;
}
}
}
}
requestPermissions方法执行后,页面上就会弹出一个权限申请的对话框,用户可以选择允许和拒绝,应用也可以根据下面这个回调来处理用户允许或者拒绝的事件
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && requestCode == 200) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { // 用户点的拒绝,仍未拥有权限
Toast.makeText(this, "请在设置中打开摄像头或存储权限", Toast.LENGTH_SHORT).show();
// 可以选择添加如下代码在系统设置中打开该应用的设置页面
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
return;
}
}
}
}