Widget中设置Room存储的图片URI出现FileProvider配置错误如何解决
问题根因
你当前的报错由两个问题共同导致:
- 构造File对象时直接传入了带
file://前缀的Uri字符串,解析得到的文件路径额外多了/file:前缀,和实际存储路径不匹配 - 未给桌面启动器授予FileProvider Uri的临时访问权限,且FileProvider的路径配置未匹配存储目录
解决步骤
1. 修正Uri转File的逻辑
// 先将数据库中存储的Uri字符串解析为Uri对象 val originalUri = Uri.parse(uri.uri) // 取Uri的真实路径构造File对象 val imageFile = File(requireNotNull(originalUri.path)) // 生成FileProvider授权Uri val photoURI = FileProvider.getUriForFile( context, "com.sudharsanravikumar.myapplication.provider", imageFile ) // 给桌面启动器授予临时读权限,否则桌面组件进程无法访问图片 context.grantUriPermission( context.packageManager.getLauncherPackageName(), photoURI, Intent.FLAG_GRANT_READ_URI_PERMISSION ) views.setImageViewUri(R.id.img_1, photoURI)
2. 配置FileProvider
首先在AndroidManifest.xml的<application>节点下添加Provider声明:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.sudharsanravikumar.myapplication.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
在res/xml目录下新建file_paths.xml文件,配置你存储图片的目录路径:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 匹配外部媒体目录下的应用专属路径下的AlbumExpo子目录 --> <external-media-path name="album_expo" path="AlbumExpo/" /> </paths>
内容的提问来源于stack exchange,提问作者barryalan2633
相关产品推荐
相关产品推荐

