背景:
之前的项目一直都是跑在Android版本5.0的设备上的,现在要大批量的更换设备(Android 9),所以遇到了调用相机失败的问题
问题抛出:
java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=org.codeaurora.snapcam/com.android.camera.PermissionsActivity clip={text/uri-list U:file:///storage/emulated/0/workupload.jpg} (has extras) } from ProcessRecord{be96695 17825:com.tisane.pda/u0a95} (pid=17825, uid=10095) with revoked permission android.permission.CAMERA
解决问题:
看到这个问题脑子里首先想到的就是权限的问题,然后着手添加动态申请权限的代码
之前的代码是这样的,是直接调用的系统相机
rechecked_img_noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
onJurisdiction()
}
});
public void photo() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "workupload.jpg"));
//指定照片保存路径(SD卡),workupload.jpg为一个临时文件,每次拍照后这个图片都会被替换
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
}
Android6.0之后这样做就不行了,google对用户隐私安全这块做到位了,于是出现了动态申请权限,需要用户同意才行
改完之后的代码
//调用相机的点击事件
rechecked_img_noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
onJurisdiction()
}
});
//动态申请权限
private void onJurisdiction(){
if (Build.VERSION.SDK_INT >= 23) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.CAMERA},0);
return;
}else{
photo();
}
} else {
photo();
}
}
//动态申请权限返回结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 0:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
photo();
} else {
Toast.makeText(getActivity(), "用户么有同意开启这个权限", Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
//调用系统相机
public void photo() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "workupload.jpg"));
//指定照片保存路径(SD卡),workupload.jpg为一个临时文件,每次拍照后这个图片都会被替换
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
}