exposed beyond app through Intent.getData(),或FileUriExposedException

本文介绍了解决Android 7.0及以上版本中使用拍照功能时出现的exposedbeyondappthroughIntent.getData()错误及FileUriExposedException异常的方法。通过在Application的onCreate()方法中添加特定代码,可以有效避免这些问题。

Android7.0及以上版本拍照报错

exposed beyond app through Intent.getData(),或FileUriExposedException

解决方法:

 

在Application的onCreat()方法中添加以下代码:

// android 7.0系统解决拍照的问题

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();

StrictMode.setVmPolicy(builder.build());

builder.detectFileUriExposure();

 

exposed beyond app through Intent.getData()”问题通常会引发 `android.os.FileUriExposedException` 异常,这是因为对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在应用外部公开 `file:// URI`,若包含文件 URI 的 intent 离开应用,就会出现该异常 [^3]。以下是相关的解决方案: ### 配置 FileProvider 在 `AndroidManifest` 中配置 `FileProvider`,示例代码如下: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths_public" /> </provider> ``` 这里的 `android:authorities` 可以使用 `${applicationId}`,也可以自定义一个唯一的字符串。`@xml/file_paths_public` 是需要创建的一个 XML 文件,用于指定共享的文件路径 [^3]。 ### 修改代码 在代码中根据 Android 版本使用不同的方式处理文件 URI,示例代码如下: ```java File apkFile = new File(saveFileName); if (!apkFile.exists()) { return; } Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri contentUri = FileProvider.getUriForFile(mContext, "com.rfid.application.MyApplication.provider", apkFile); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } mContext.startActivity(intent); ``` 当 Android 版本大于等于 `N`(即 Android 7.0)时,使用 `FileProvider.getUriForFile` 方法获取内容 URI,并添加 `FLAG_GRANT_READ_URI_PERMISSION` 权限;小于 `N` 时,直接使用 `Uri.fromFile` 方法 [^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值