Issue
trying to get file(PDF) form internal storage to upload on server with the help of Android ResultLauncher
API, getting Uri in result but I am unable to read that Uri.
When trying to copy that file to my app's scope directory with the help of result Uri,
getting permission error on contentResolver.openInputStream(uri)
. this is the error:
Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri <my file uri> requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
How can I copy file in app's scope directory? This is my ResultLauncher:
singleTypeResultLauncher =
fragment.registerForActivityResult(ActivityResultContracts.GetContent()){
result ->
result?.let{
val tempUri = Uri.parse(it.toString().replace("%3A", ":"))
val path = createCopyAndReturnRealPath(fragment.requireContext(), tempUri)
}
}
this is how I am launching:
singleTypeResultLauncher.launch("application/pdf")
this is method in with app is crashing:
crashing on val inputStream = contentResolver.openInputStream(uri)
fun createCopyAndReturnRealPath(context: Context, uri: Uri): String? {
val contentResolver = context.contentResolver ?: return null
val mimeType = getMimeType(context, uri).getSafe()
val fileExt = "." + mimeType.substring(mimeType.indexOf('/') + 1)
val filePath: String = (context.dataDir.absolutePath + File.separator
+ System.currentTimeMillis())
val file = File(filePath)
try {
file.parentFile.mkdirs()
file.createNewFile()
val inputStream = contentResolver.openInputStream(uri) ?: return null //crashing here
val outputStream: OutputStream = FileOutputStream(file)
val buf = ByteArray(1024)
var len: Int
while (inputStream.read(buf).also { len = it } > 0) outputStream.write(buf, 0, len)
outputStream.close()
inputStream.close()
} catch (ignore: IOException) {
return null
}
return file.absolutePath
}
using provider paths:
<paths>
<external-path
name="external"
path="." />
<external-files-path
name="external_files"
path="." />
<cache-path
name="cache"
path="." />
<external-cache-path
name="external_cache"
path="." />
<files-path
name="files"
path="." />
</paths>
Solution
I am unable to read that Uri
You are not trying to read that Uri
. You are trying to read a different Uri
:
val tempUri = Uri.parse(it.toString().replace("%3A", ":"))
Replace that with:
val tempUri = it
...or, just remove tempUri
entirely and use it
directly.
trying to get file(PDF) form internal storage to upload on server
Note that you do not necessarily need to copy the content to upload it.
Answered By - CommonsWare
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.