安卓开发拍照时闪退遇到问题: file:///storage/emulated/0/0.jpg exposed beyond app through ClipData.Item.getUri()

本文详细描述了在使用Android设备进行拍照时遇到的应用程序闪退问题,特别是当尝试保存图片到特定目录时触发的FileUriExposedException异常。通过在Application的onCreate()方法中添加StrictMode.VmPolicy相关代码,可以有效避免该问题,确保应用程序稳定运行。

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

问题描述:

打开摄像头拍照时程序闪退,错误提示如下:

android.os.FileUriExposedException: file:///storage/emulated/0/RadioDirectory/IMG_20190417_095708.jpg exposed beyond app through ClipData.Item.getUri()

截图:

解决方法:

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

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();

 

这个问题是由于 Android7.0 之后为了增强应用安全性而引入的权限机制导致的。当你在应用中通过 FileProvider 获取某个文件,Android 系统会认为该文件是私有的,其他应用程序无法访问,这样就能提高应用的安全性。 解决这个问题的方法是使用 FileProvider 来获取文件 Uri。具体步骤如下: 1. 在 AndroidManifest.xml 文件中添加 FileProvider 的声明: ``` <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` 其中,`android:authorities` 属性的值应该是你的应用包名加上 `.fileprovider`,这个值将用于区分不同应用的 FileProvider;`android:grantUriPermissions` 属性表示该 provider 是否允许授予 URI 权限;`android:exported` 属性表示该 provider 是否允许其他应用访问;`android.support.FILE_PROVIDER_PATHS` 属性指向一个 xml 文件,该文件定义了你要共享的文件的路径。 2. 在 res/xml 目录下创建一个名为 file_paths.xml 的文件,用于定义你要共享的文件路径: ``` <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> ``` 其中,`<external-path>` 标签表示你要共享的文件路径,`name` 属性可以随意指定,`path` 属性指向你要共享的文件或目录的路径。在本例中,我们指定共享外部存储器中的文件,`path` 属性的值为 `.` 表示共享整个外部存储器。 3. 最后,使用 FileProvider.getUriForFile() 方法来获取文件 Uri: ``` File file = new File("/storage/emulated/0/image2065.jpg"); Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", file); ``` 其中,`context` 表示当前上下文,`getApplicationContext().getPackageName() + ".fileprovider"` 表示 FileProvider 的 authorities,`file` 表示你要获取 Uri 的文件。 通过使用 FileProvider,应用就能够安全地共享文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值