Android - 调用系统相机 (适配Android10)

  1. 相机拍照
private Uri mImageUri;


//假设拍照片保存在DCIM公共目录,为了查看方便,尽可能的将逻辑写在一个方法里
private void takePicture() {
    String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();
    String name = System.currentTimeMillis() + ".jpg";
    File file = new File(path,name);

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    /**
     *  主要适配的点在mImageUri赋值这里
     */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android Q得用MediaStore先存一下
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DISPLAY_NAME,name);
        values.put(MediaStore.Images.Media.RELATIVE_PATH,Environment.DIRECTORY_DCIM);
        values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
        mUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // Android N版本需要用FileProvider
        mUri = FileProvider.getUriForFile(this,getPackageName()+ "fileProvider",file);
    } else {
        // 古老的版本用这个
        mUri = Uri.fromFile(file);
    }
    // 指定图片保存的位置
    intent.putExtra(MediaStore.EXTRA_OUTPUT,mUri); 
    startActivityForResult(intent,REQUEST_CODE_CAMERA);
}

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_CAMERA) {
            if (resultCode == RESULT_OK) {
                // 这里就不要用data.getData()了,有可能返回空。
                // 直接用之前的mUri
                // 低版本需要绝对地址的,直接拿方法中的path
                Glide.with(this).load(mUri).into(mImageView);
            }
        }
    }
  1. 拍视频
    依葫芦画瓢吧!

你可能感兴趣的:(Android - 调用系统相机 (适配Android10))