Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Uri获取文件在kotlin中导致FileNotFoundException,如何获取实际文件路径_Android_File_Kotlin_Uri - Fatal编程技术网

Android 从Uri获取文件在kotlin中导致FileNotFoundException,如何获取实际文件路径

Android 从Uri获取文件在kotlin中导致FileNotFoundException,如何获取实际文件路径,android,file,kotlin,uri,Android,File,Kotlin,Uri,我想上传一个在画廊挑选的标志到我们的api通过多部分。 我使用的是网络库中的multipartFile方法,它接受一个File in参数: 文件对象可以使用Uri作为构造函数 通过从gallery返回中接收到的uri,我可以在ImageView中显示图像,但是当传入FileConstructor时,uri或uri.path会导致FileNotFoundException。internet、读、写权限在清单中声明 有与此功能相关的所有代码: //selected image uri private

我想上传一个在画廊挑选的标志到我们的api通过多部分。 我使用的是网络库中的multipartFile方法,它接受一个File in参数:

文件对象可以使用Uri作为构造函数

通过从gallery返回中接收到的uri,我可以在ImageView中显示图像,但是当传入FileConstructor时,uri或uri.path会导致FileNotFoundException。internet、读、写权限在清单中声明

有与此功能相关的所有代码:

//selected image uri
private var imageUri: Uri? = null
set(value) {
    field = value

    field?.let { //value after picking image is : content://com.android.providers.media.documents/document/image%3A25
        uploadImageFile(imageUri= it,
            route = "uploadImageRoute/",
            onProgression = { progress ->
                Log.d("upload", "progress= $progress")
            },
            onSuccess = {
                Log.d("upload", "upload success !")
            },
            onError = { errorMessage ->
                Log.d("upload", "error= $errorMessage")
            })
        }
}


//select image button clicked, go to image gallery to pick an image
override fun onClick(v: View?) {
    val intent = Intent()
    intent.type = "image/*"
    intent.action = Intent.ACTION_GET_CONTENT
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), 0)
}


//comeback from image gallery
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null) {
        val selectedPhotoUri = data.data!!
        imageUri = selectedPhotoUri
    }
}

//prepare request headers
private fun configureHeaders(): MutableMap<String,Any> {
    var headerMap = mutableMapOf<String, Any>()
    headerMap["Content-Type"] = "multipart/form-data"
    headerMap["Accept"] = "application/json, text/plain"
    return headerMap
}

private fun uploadImageFile(imageUri: Uri, route: String, onProgression: (Double) -> Unit, onSuccess: () -> Unit, onError: (String?) -> Unit) {
    val headers = configureHeaders()
        var file = File(imageUri.path)

        AndroidNetworking.upload("https://api.ourDomain.com/$route")
            .addMultipartFile("file", file)
            .addHeaders(headers)
            .build()
            .setUploadProgressListener { uploaded, total ->
                val percentage = 100 * uploaded / total as Double
                onProgression(percentage)
            }
            .getAsJSONObject(object : JSONObjectRequestListener {
                override fun onResponse(response: JSONObject?) {
                    onSuccess()
                }

                override fun onError(anError: ANError?) {
                    onError(anError.toString())
                }
            })
}
如何获取要放入文件构造函数参数的文件的实际路径