Android10之后调用相机的方式跟之前又不一样了
记录下.
<1>申请相机权限
<uses-permission android:name="android.permission.CAMERA" />
动态权限申请:
// 这里的写法是可以同时申请多个权限
String[] permissions = new String[]{
Manifest.permission.CAMERA
};
// 声明一个集合,在后面的代码中用来存储用户拒绝授权的权
List<String> mPermissionList = new ArrayList<>();
//权限,可用于回调,比如打开相机时再申请权限,回调直接打开
private static final int MY_PERMISSIONS_REQUEST_CODE = 100001;
//拍照回调
private final int CAMERA_WITH_DATA = 100011;
/**
* 检查权限,逐个判断是否还有未通过的权限
*/
private void getPermissions() {
mPermissionList.clear(); //清空已经允许的没有通过的权限
for (int i = 0; i < permissions.length; i++) { //逐个判断是否还有未通过的权限
if (ContextCompat.checkSelfPermission(mContext, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.size() > 0) { //有权限没有通过,需要申请
ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST_CODE);
} else {
//权限已经都通过了,可以继续操作
}
}
<2>权限到位,可以调用相机了(这里只做Android10方案,因为本人测试可向下兼容,用一种即可)
//用于保存拍照图片的uri
private Uri mCameraUri;
/**
* 创建图片地址uri,Android 10以后使用这种方法,并且我只用这种方式,可向下兼容,不做繁琐的判断了
*/
private void openCamera() {
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断是否有相机
if (captureIntent.resolveActivity(getPackageManager()) != null) {
Uri photoUri = null;
// 适配android 10
mCameraUri = createImageUri();
if (mCameraUri != null) {
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraUri);
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(captureIntent, CAMERA_WITH_DATA);
}
}
}
/**
* 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法
* @return 图片的uri
*/
private Uri createImageUri() {
String status = Environment.getExternalStorageState();
// 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储
if (status.equals(Environment.MEDIA_MOUNTED)) {
return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
} else {
return getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, new ContentValues());
}
}
<3>接收拍照回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_WITH_DATA) {
if (resultCode == RESULT_OK) {
if (isAndroidQ) {
// Android 10 使用图片uri加载
你的图片控件.setImageURI(mCameraUri);
} else {
// 使用图片路径加载
你的图片控件.setImageBitmap(BitmapFactory.decodeFile(mCameraImagePath));
}
} else {
Toast.makeText(this,"取消",Toast.LENGTH_LONG).show();
}
}
}