Android java.lang.RuntimeException:未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=file:///storage/0EE6-4002/Mete/test.jpg}}
我正在通过应用程序从存储中获取图片。通常,来自onActivityResult中的数据的uri不为null,并以图片的“content://”开头。但有些应用程序为同一张图片提供了以“file://”开头的uri。Glide也不能使用“file://”uri。所以我想从FileProvider获取uri。当我把这个uri给FileProvider时,我得到了这个错误Android java.lang.RuntimeException:未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=file:///storage/0EE6-4002/Mete/test.jpg}},android,file,android-fileprovider,Android,File,Android Fileprovider,我正在通过应用程序从存储中获取图片。通常,来自onActivityResult中的数据的uri不为null,并以图片的“content://”开头。但有些应用程序为同一张图片提供了以“file://”开头的uri。Glide也不能使用“file://”uri。所以我想从FileProvider获取uri。当我把这个uri给FileProvider时,我得到了这个错误 2021-01-10 19:01:55.453 30049-30049/com.example.photoselector E/A
2021-01-10 19:01:55.453 30049-30049/com.example.photoselector E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.photoselector, PID: 30049
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=file:///storage/0EE6-4002/Mete/IMG_20210108_120951.jpg typ=image/jpeg flg=0x3 }}
to activity {com.example.photoselector/com.example.photoselector.MainActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /file:/storage/0EE6-4002/Mete/IMG_20210108_120951.jpg
当相同的图片uri与“content://”一起出现时没有问题,当它与来自另一个应用程序的“file://”一起出现时,我得到一个错误
Im通过以下代码创建意图:
private fun initData() {
button_storage.setOnClickListener {
val intent = Intent()
intent.type = "image/*"
intent.action = Intent.ACTION_GET_CONTENT
startActivityForResult(
Intent.createChooser(
intent,
"Select App"
), SELECT_PICTURE
)
}
}
从以下位置获取Uri:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (resultCode) {
Activity.RESULT_OK -> {
isExistCheck.isChecked = false
setImageWiaUri(data?.data ?: tempFileUri)//tempFileUri for camera option
when (requestCode) {
CAMERA_PICTURE -> {
Toast.makeText(this, "CAMERA", Toast.LENGTH_SHORT).show()
}
SELECT_PICTURE -> {
Toast.makeText(this, "STORAGE", Toast.LENGTH_SHORT).show()
}
}
}
Activity.RESULT_CANCELED -> {
Toast.makeText(this, "CANCELED", Toast.LENGTH_SHORT).show()
}
}
}
这是我的密码:
private fun setImageWiaUri(uri: Uri) {
isExistCheck.isChecked = isFileExist(uri)
var imgUri = uri
if (isFileExist(uri)) {
if (uri.toString().split(":")[0] == "file") {
imgUri = FileProvider.getUriForFile(
this,
"com.example.photoselector.fileprovider",
File(uri.toString())
)
}
Glide.with(this)
.load(imgUri)
.into(image)
} else {
Toast.makeText(this, "File does not exist...", Toast.LENGTH_SHORT).show()
}
}
我的提供者路径:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-cache-path
name="external_cache_files"
path="."/>
<external-files-path
name="external_files"
path="." />
<files-path
name="files"
path="." />
<external-media-path
name="external_media"
path="." />
<external-path
name="externals"
path="." />
<cache-path
name="cache_files"
path="." />
</paths>
如何解决这个问题,或者如何将“file://”uri转换为“content://”uri
但有些应用程序给我的uri以“file://”开头。Glide也不能使用“file://”uri
ACTION\u GET\u CONTENT
实现的任务是向您返回有用的Uri
。您可以通过将CATEGORY\u OPENABLE
添加到您的Intent
中来消除一些麻烦的应用程序,这表示您希望能够打开由Uri
标识的内容
Glide可以使用文件://
Uri
,前提是您的应用程序具有访问该文件的权限
如何将“file://”uri转换为“content://”uri
那不是你的问题<代码>内容://不是表示“Uri将起作用”的神奇字符串,文件://
不是表示“Uri将不起作用”的神奇字符串
您没有解释Glide遇到的具体问题。我猜您没有该文件的读取权限。如果是这样,FileProvider
不会给您魔法读取权限,就像HeyThisClassIsMagic
类会给您读取权限一样。您的应用程序具有读取权限,或者没有
确保您的应用程序拥有读取外部存储
权限,并在运行时请求该权限。另外,请确保您的应用程序在清单中的
元素中有android:requestLegacyExternalStorage=“true”
。这些步骤将增加您能够读取由Uri
标识的内容的可能性
如果这没有帮助,那么我建议您问一个单独的问题,在这里您可以显示如何将返回的文件://
Uri
与Glide一起使用,以及您会遇到什么具体错误