Android java.lang.RuntimeException:未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=file:///storage/0EE6-4002/Mete/test.jpg}}

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

我正在通过应用程序从存储中获取图片。通常,来自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/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一起使用,以及您会遇到什么具体错误