Android 7.0之后添加拍照功能遇到的坑

在6.0之前的系统Android调用相机拍照很容易实现,但同样的代码在7.0运行就会报错,原因就是7.0系统限制了直接调用系统相机的权限,怎么办呢,跟我一步一步来实现。

第一步:申请拍照权限就不用多说了,6.0之后就需要动态申请拍照权限;

第二步:AndroidManifest.xml 文件中配置一些参数,目的就是向系统申请应用调用相机的通道,下图中authorities属性后面填写你项目的包名,如下图;

Android 7.0之后添加拍照功能遇到的坑

第三步:上图下面resource需要引入一个文件,这个需要在项目res目录下新建一个xml文件夹,并在其中新建一个provider_paths.xml文件;

Android 7.0之后添加拍照功能遇到的坑

第四步:在provider_paths.xml文件中填写如下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_path"
        path="." />
</paths>

第五步:新建一个拍照类处理拍照逻辑,代码如下

public class CameraActivity extends BaseActivity {

    String cameraPath;
    private final static int REQUEST_CAREMA = 1;
    public static String SAVED_IMAGE_DIR_PATH;// 拍照路径

    @Override
    public void initView(Bundle savedInstanceState) {
        SAVED_IMAGE_DIR_PATH = MyUtils.getCachePath(this);
        TakePhoto();
    }

    @Override
    public void initListener() {
    }

    @Override
    public void initData() {
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {//拍照完成
            switch (requestCode) {
                case REQUEST_CAREMA://相机
                    Intent rsl = new Intent();
                    rsl.putExtra("path", cameraPath);
                    setResult(111, rsl);
                    finish();
                    break;
            }
        } else {//拍照未完成
            finish();
        }
    }

    @Override
    public void onClick(View v, int id) {

    }

    //拍照
    private void TakePhoto() {
        if (hasSdcard()) {
            //图片名称
            cameraPath = SAVED_IMAGE_DIR_PATH + System.currentTimeMillis() + ".png";
            String out_file_path = SAVED_IMAGE_DIR_PATH;
            //创建存放图片的文件夹
            File dir = new File(out_file_path);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (Build.VERSION.SDK_INT >= 24) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.putExtra(MediaStore.EXTRA_OUTPUT,
                        FileProvider.getUriForFile(CameraActivity.this,
                                "com.htxhb.xhb.fileprovide", new File(cameraPath)));
            } else {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(cameraPath)));
            }
            startActivityForResult(intent, REQUEST_CAREMA);
        } else {
            PreferencesUtils.showMsg("请确认已经插入SD卡");
        }
    }

    /*判断存储卡是否可以用*/
    private boolean hasSdcard() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }
}

第六步:复制代码运行一下感受一下吧!