Android 拍照适配Android10(Q)

Android10之后调用相机的方式跟之前又不一样了
记录下.

<1>申请相机权限


动态权限申请:

    // 这里的写法是可以同时申请多个权限
    String[] permissions = new String[]{
            Manifest.permission.CAMERA
    };
    // 声明一个集合,在后面的代码中用来存储用户拒绝授权的权
    List 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();
            }
        }
    }

你可能感兴趣的:(Android 拍照适配Android10(Q))