image.pngAndroid6.0中新添加了运行时权限,对于一些敏感的权限系统要求等用户确认授予权限后才可使用。如果没做Android6.0的适配在Android6.0的设备上并且apk的目标版本高于23,一些功能可能因为未能获取权限而崩溃。
运行时权限官方文档
下面以获取打开相册权限为例,了解下运行时权限的适配处理,需要处理的敏感权限信息同时也应该在清单文件中声明。
检查是否已获得相应权限
if (ContextCompat.checkSelfPermission(view.getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED)
未获取相应权限
如果还没有获取相应权限通过下面的方法申请
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, 100);
系统会弹窗对话框像用户申请权限,用户同意或拒绝都会在onRequestPermissionsResult
方法中回调
回调方法参数中会有请求码,申请的权限数组和申请结果数组,如果对应的返回结果是
PERMISSION_GRANTED
代表用户同意了该请求。
Fragment中和Activity中请求获取权限的方法稍有不同,上面的方法如果在Fragment中不能成功获取回调。在Fragment中应使用requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, 100);
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1001);
}else {
Snackbar.make(getWindow().getDecorView(),"获取权限被拒绝",Snackbar.LENGTH_SHORT)
.show();
}
此外系统提供了另外一个方法,当你申请的权限被拒绝时可以向用户接受获取该权限的原因的api,但检查没有获取到权限可以加层判断解释获取的原因。
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {
Snackbar.make(view,"请求获取打开相册权限",Snackbar.LENGTH_SHORT)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, 100);
}
}).show();
}
已经获取相应权限
如果已经获取了权限,则直接走打开相册的代码逻辑
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1001);
获取权限主要代码如下
private void showCamera(View view) {
if (ContextCompat.checkSelfPermission(view.getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
Log.i("whl", "请求获取权限");
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {
Snackbar.make(view,"请求获取打开相册权限",Snackbar.LENGTH_SHORT)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, 100);
}
}).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, 100);
}
} else {
Log.i("whl", "获取了相机权限");
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1001);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.i("whl",permissions[0]+"----"+grantResults[0]);
if (requestCode==100){
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1001);
}else {
Snackbar.make(getWindow().getDecorView(),"获取权限被拒绝",Snackbar.LENGTH_SHORT)
.show();
}
}
}
网友评论