FileUriExposedException使用Android 7

FileUriExposedException使用Android 7,android,android-7.0-nougat,Android,Android 7.0 Nougat,当我尝试拍摄图片时,出现以下错误: 致命异常:主 android.os.FileUrieExposedException: file:///storage/emulated/0/fname_1498727381241.jpg 暴露在应用程序之外 通过ClipData.Item.getUri() 在android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) 在android.net.Uri.checkFileUriExposed(Uri

当我尝试拍摄图片时,出现以下错误:

致命异常:主 android.os.FileUrieExposedException: file:///storage/emulated/0/fname_1498727381241.jpg 暴露在应用程序之外 通过ClipData.Item.getUri() 在android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) 在android.net.Uri.checkFileUriExposed(Uri.java:2346) 在android.content.ClipData.prepareToLeaveProcess(ClipData.java:835)中 位于android.content.Intent.prepareToLeaveProcess(Intent.java:9514) 位于android.content.Intent.prepareToLeaveProcess(Intent.java:9499) 在 execStartActivity(Instrumentation.java:1525) 在android.app.Activity.startActivityForResult(Activity.java:4403)上 在android.app.Activity.startActivityForResult上(Activity.java:4362) 在 com.belami.CommuniquerPartagerPhotosActivity$1.onClick(CommuniquerPartagerPhotosActivity.java:46) 在android.view.view.performClick上(view.java:6261) 在android.view.view$PerformClick.run(view.java:23752) 位于android.os.Handler.handleCallback(Handler.java:751) 位于android.os.Handler.dispatchMessage(Handler.java:95) 位于android.os.Looper.loop(Looper.java:154) 位于android.app.ActivityThread.main(ActivityThread.java:6776) 位于java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

它以前工作过,但问题似乎是因为我使用了安卓7(API 24)

这是我的代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "fname_" +
                        String.valueOf(System.currentTimeMillis()) + ".jpg"));
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
如果您的targetSdkVersion为24或更高,我们必须使用FileProvider 类来授予对特定文件或文件夹的访问权,以使其 可用于其他应用程序。我们创建自己的类继承 FileProvider,以确保我们的FileProvider不冲突 使用在导入的依赖项中声明的文件提供程序,如下所述 在这里

查找相关讨论


由于Android 7,我们不使用file:scheme作为意图的uri,您必须使用FileProvider

正确的方法是使用
FileProvider
()。但是我想出了一个不添加
FileProvider
的顽皮方法。这显然是一个解决办法,但它是有效的

在活动中,添加以下行:

 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 StrictMode.setVmPolicy(builder.build());
这将忽略URI公开,您将获得访问权限

是的,我知道这不是最好的做法。但我只是想提供一个替代方案


不过,推荐的方法是使用
FileProvider

我们现在在官方培训文件上有了。检查答案。在Android中使用API级别24的文件提供程序。它可以工作。我在我打开本地HTML文档的活动中添加了这个。。tq如此之多,这不必在生产应用程序中使用。@Jorgesys感谢您提供的信息。我可以知道如果我们在生产中使用它会有什么风险吗?我相信第三方可以直接访问内容,因为这绕过了限制。