执行以下代码后,打开相机
//调用相机自带的照相功能 指定图片目录 if (Environment.getExternalStorageState().endsWith(Environment.MEDIA_MOUNTED)) { imgFile=new File(Environment.getExternalStorageDirectory(), "/test/img.jpg"); } if (!imgFile.exists()) { imgFile.getParentFile().mkdirs(); } Uri uri=Uri.fromFile(imgFile); Intent intent2=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//启动自带的照相功能 intent2.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent2, 2);
报错以下
android.os.FileUriExposedException: file:///storage/emulated/0/test/img.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1978)
at android.net.Uri.checkFileUriExposed(Uri.java:2371)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:963)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10252)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10237)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1669)
at android.app.Activity.startActivityForResult(Activity.java:4651)
原因是Android studio的SDK版本太高,
targetSdkVersion 32 compileSdkVersion 32 buildToolsVersion "32.0.0"
当targetSdkVersion 32改成23就可以打开相机,此时Android的版本是Android6
到了把targetSdkVersion 23改成24就开始报错,变成Android7
解决方式
在方法onCreate(){}里面创建四行代码,代码里面执行查询异常
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();//严格模式,虚拟机政策,构建器 StrictMode.setVmPolicy(builder.build()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//构建器SDK版本大于或等于构建器代码版本 builder.detectFileUriExposure();//构建器就侦察出FileUriExposure }