在学习Camera章节的时候遇到如下错误,使用的模拟器安卓版本为9.0
错误正文:
Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/1556171564623.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:10216)
at android.content.Intent.prepareToLeaveProcess(Intent.java:10201)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1667)
at android.app.Activity.startActivityForResult(Activity.java:4586)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4544)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at com.example.a4_25camera.MainActivity.photo(MainActivity.java:32)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
原因是Android 7.0及以上不允许intent带有file://
的URI离开自身的应用。
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在应用外部公开
file:// URI
, 如果一项包含文件 URI 的 intent 离开应用,则应用出现故障,并出现 FileUriExposedException 异常。要应用间共享文件,您应发送一项
content:// URI
,并授予URI
临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅 共享文件
解决方法一般推荐使用FileProvider(Android 7.0新特性)
可以参考:
https://www.jianshu.com/p/68a4e8132fcd
https://developer.android.com/training/secure-file-sharing/index.html
简单起见,使用了👇的解决方案
在Application.onCreate加入如下代码,置入一个不设防的VmPolicy:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); }
再用旧的方式直接把
file://
格式的URI发送出去。
作者:hqzxzwb
链接:https://www.jianshu.com/p/68a4e8132fcd
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。