Android 7.0之后添加拍照功能遇到的坑
在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);
}
}
第六步:复制代码运行一下感受一下吧!