在6.0之前的系统Android调用相机拍照很容易实现,但同样的代码在7.0运行就会报错,原因就是7.0系统限制了直接调用系统相机的权限,怎么办呢,跟我一步一步来实现。
第一步:申请拍照权限就不用多说了,6.0之后就需要动态申请拍照权限;
第二步:AndroidManifest.xml 文件中配置一些参数,目的就是向系统申请应用调用相机的通道,下图中authorities属性后面填写你项目的包名,如下图;
第三步:上图下面resource需要引入一个文件,这个需要在项目res目录下新建一个xml文件夹,并在其中新建一个provider_paths.xml文件;
第四步:在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); } }
第六步:复制代码运行一下感受一下吧!