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>