Here is my Code
val launcher1 = rememberLauncherForActivityResult(contract =
ActivityResultContracts.GetContent()) { uri: Uri? ->
imageUri1 = uri
}
And I must give to ViewModel Like this
fun deviceComplete(deviceId: Int?, file:File?) = viewModelScope.launch{
}
How to convert this uri to File ..?? I'm really don't know
CodePudding user response:
This example for image Uri to File
Application.instance - this instance from Singleton Application Class
@Suppress("DEPRECATION")
fun Uri.asFile(): File? {
Application.instance.contentResolver
.query(this, arrayOf(MediaStore.Images.Media.DATA), null, null, null)
?.use { cursor ->
cursor.moveToFirst()
val cursorData =
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))
return if (cursorData == null) {
returnCursorData(this)?.let { File(it) }
} else {
File(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)))
}
}
return null
}
@Suppress("DEPRECATION")
private fun returnCursorData(uri: Uri?): String? {
val context = Application.instance
if (DocumentsContract.isDocumentUri(context, uri)) {
val wholeID = DocumentsContract.getDocumentId(uri)
val splits = wholeID.split(":".toRegex()).toTypedArray()
if (splits.size == 2) {
val id = splits[1]
val column = arrayOf(MediaStore.Images.Media.DATA)
val sel = MediaStore.Images.Media._ID "=?"
val cursor: Cursor? = context.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, arrayOf(id), null
)
val columnIndex: Int? = cursor?.getColumnIndex(column[0])
if (cursor?.moveToFirst() == true) {
return columnIndex?.let { cursor.getString(it) }
}
cursor?.close()
}
} else {
return uri?.path
}
return null
}
CodePudding user response:
This example for image Uri to File path
fun getPath2uri(context: Context, fileUri: Uri): String? {
if (DocumentsContract.isDocumentUri(context, fileUri)) {
if (isExternalStorageDocument(fileUri)) {
val docId = DocumentsContract.getDocumentId(fileUri)
val split = docId.split(":").toTypedArray()
val type = split[0]
if ("primary".equals(type, ignoreCase = true)) {
return context.getExternalFilesDir(null).toString() "/" split[1]
}
} else if (isDownloadsDocument(fileUri)) {
val id = DocumentsContract.getDocumentId(fileUri)
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:".toRegex(), "")
}
val contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
java.lang.Long.valueOf(id)
)
return getDataColumn(context, contentUri, null, null)
} else if (isMediaDocument(fileUri)) {
val docId = DocumentsContract.getDocumentId(fileUri)
val split = docId.split(":").toTypedArray()
val contentUri: Uri = when (split[0]) {
"image" -> {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}
"video" -> {
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
"audio" -> {
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
else -> {
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
}
val selection = MediaStore.Images.Media._ID "=?"
val selectionArgs = arrayOf(split[1])
return getDataColumn(context, contentUri, selection, selectionArgs)
}
} // MediaStore (and general)
else if ("content".equals(fileUri.scheme, ignoreCase = true)) {
// Return the remote address
return if (isGooglePhotosUri(fileUri)) {
fileUri.lastPathSegment
} else getDataColumn(context, fileUri, null, null)
} else if ("file".equals(fileUri.scheme, ignoreCase = true)) {
return fileUri.path
}
return null
}
private fun isGooglePhotosUri(uri: Uri): Boolean {
return "com.google.android.apps.photos.content" == uri.authority
}
private fun getDataColumn(
context: Context,
uri: Uri,
selection: String?,
selectionArgs: Array<String>?
): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor != null && cursor.moveToFirst()) {
return cursor.getString(cursor.getColumnIndexOrThrow(column))
}
} finally {
cursor?.close()
}
return null
}
private fun isExternalStorageDocument(uri: Uri): Boolean {
return "com.android.externalstorage.documents" == uri.authority
}
private fun isDownloadsDocument(uri: Uri): Boolean {
return "com.android.providers.downloads.documents" == uri.authority
}
private fun isMediaDocument(uri: Uri): Boolean {
return "com.android.providers.media.documents" == uri.authority
}
