安卓异常:android.os.FileUriExposedException:

本文介绍了解决Android应用中出现的FileUriExposedException异常的方法。通过配置file-provider并使用FileProvider API,确保应用程序间安全地共享文件资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    android.os.FileUriExposedException: file:///storage/emulated/0/picture1537259111.jpg exposed beyond app throughClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
        at android.net.Uri.checkFileUriExposed(Uri.java:2346)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
        at android.app.Activity.startActivityForResult(Activity.java:4224)
        at android.app.Activity.startActivityForResult(Activity.java:4183)
        at com.zxyoyo.apk.xunfei.voicedemo.faceonline.OnlineFaceDemo.onClick(OnlineFaceDemo.java:393)
        at android.view.View.performClick(View.java:5610)
        at android.view.View$PerformClick.run(View.java:22265)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

 

起因:打开相机打算拍照

解决:编写file-provider

authorities:自己的包名+随便一个名称(整个字符串代码中会调用)

resource:下一步需要新建的一个文件

<provider
            android:authorities="com.zxyoyo.apk.xunfei.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepath"/>
        </provider>

res目录下新建xml文件夹(存在的话就不用了)

新建filepath文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <files-path name="my_img" path="img/" />
    <external-path name="img" path="img/" />
    // 说明:name的对应关系 path为文件夹的名称
    files-path          ------>Context.getFilesDir()
    cache-path          ------>Context.getCacheDir()
    external-path       ------>Environment.getExternalStorageDirectory()
    external-files-path ------>Context.getExternalFilesDir()
    external-cache-path ------>Context.getExternalCacheDir()
</paths>

java代码调用:

Uri uri;
mPictureFile = new File(Environment.getExternalStorageDirectory(),
                        "/img/picture" + System.currentTimeMillis()/1000 + ".jpg");
System.out.println(mPictureFile.getAbsolutePath()+"--file path");
if (Build.VERSION.SDK_INT >= 24) {
      uri =FileProvider.getUriForFile(this.getApplicationContext(),"com.zxyoyo.apk.xunfei.fileprovider", mPictureFile);
                }else {
                    uri = Uri.fromFile(mPictureFile);
                }

 

安卓 WebView跳转页面时可能会出现android.os.FileUriExposedException异常。这个异常是因为Android的安全机制限制了应用程序直接暴露本地文件的URI给其他应用程序。当我们在WebView中点击一个链接,如果该链接指向的是一个本地文件的URI,就会抛出这个异常。 解决这个问题的方法有两种: 1. 使用FileProvider:可以通过使用FileProvider来解决这个问题。FileProvider是一个特殊的ContentProvider,它可以控制共享文件的权限。我们需要在AndroidManifest.xml文件中注册FileProvider,并为要共享的文件配置相应的访问权限。然后,可以使用FileProvider的getUriForFile()方法将文件URI转换为共享URI,然后通过Intent将共享URI传递给WebView。这样可以绕过安全限制,使WebView能够顺利跳转到文件页面。 2.AndroidManifest.xml中添加文件权限:在应用程序的AndroidManifest.xml文件中添加文件访问权限可以解决此异常。我们可以使用如下代码在<application>标签内添加文件权限: <application ... android:requestLegacyExternalStorage="true"> ... </application> 这样可以设置应用程序使用旧版的外部存储沙盒,从而绕过安全限制,解决异常问题。 总结来说,当安卓WebView跳转页面时出现android.os.FileUriExposedException异常,可以使用FileProvider或者在AndroidManifest.xml中添加文件权限的方式解决。这样可以保证WebView可以顺利跳转到文件页面,而不会触发安全限制导致的异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值