前言:因为Android摄像头基础那篇简书篇幅太长,所以单独写一篇关于基于Camera的动态权限适配问题。此篇文章不仅是对上篇文章的支持,同时包含了自己对Android6.0动态权限的理解。
在上一篇文章中如果你没有接触过Android6.0的动态权限问题,就很容易遇到这些问题:java.lang.RuntimeException: Fail to connect to camera service,还有一个错是关于没有SD卡权限,但是这两个权限自己在Manifest.xml文件中早就申明了呀
解决方案:在Activity的onCreate方法中增加权限申请代码即可,亲测有效。(Manifest.xml中的权限该加的还是要加,如果不想这么麻烦,最大SDK参数设置在22及以下版本就OK了)
/** 获取权限*/
private void getPermission() {
if (Build.VERSION.SDK_INT>22){
if (ContextCompat.checkSelfPermission(MainActivity.this,
android.Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
//先判断有没有权限 ,没有就在这里进行权限的申请
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},CAMERA_OK);
}else {
//说明已经获取到摄像头权限了
Log.i("MainActivity","已经获取了权限");
}
}else {
//这个说明系统版本在6.0之下,不需要动态获取权限。
Log.i("MainActivity","这个说明系统版本在6.0之下,不需要动态获取权限。");
}
}
PackageManager有两个属性PERMISSION_GRANTED,PERMISSION_DENIED;
GRANTED是已经获取到权限,
DENIED是没有获取到权限;
剖析:对于Android 6.0之前,想要使用系统的相机进行拍照,那么只要在AndroidManifedt.xml中进行添加相应的权限,主要是摄像头权限和SD卡读写权限即可:
摄像头权限如下:
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
SD卡读写权限如下:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这样设置完成后,当在Android 6.0一下(不包括6.0)进行使用系统相机进行拍照是完全没有问题,当我们进行点击拍照功能时,此时系统就会提醒我们打开相应的权限,这说明使用系统相机进行拍照是没有问题的,但是,但使用Android 6.0以上系统(包括6.0)时,此时点击拍照功能时,程序就崩掉了。对于Android 6.0以上系统,不能只是在AndroidManifest.xml中进行配置,还要在程序代码中进行动态设置相应的权限。
ActivityCompat.requestPermissions($.getActivity(),
new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
Intent intent = new Intent(getBaseContext(), ActivityCapture.class);
startActivityForResult(intent, CameraRequestCode);
此时,在Android 6.0以上系统中就也会弹出相应的开启相机使用权限和外部存储相应的功能了,此时不管是Android 6.0以上还是以下,相机拍照功能都是相互兼容的。Google这样做也是为了安全同时也是为了增加用户管理的权力,作为开发者我们只能选择去接受更好的模式。
补充:
网友评论