44
55package app.tauri.dialog
66
7+
8+ import android.content.ContentUris
9+ import android.database.Cursor
10+ import android.provider.MediaStore
711import android.content.Context
812import android.graphics.BitmapFactory
913import android.media.MediaMetadataRetriever
1014import android.net.Uri
15+ import android.os.Environment
1116import android.provider.DocumentsContract
1217import android.provider.OpenableColumns
1318import android.util.Base64
@@ -21,8 +26,40 @@ class FilePickerUtils {
2126 class FileResolution (var height : Int , var width : Int )
2227
2328 companion object {
24- fun getPathFromUri (uri : Uri ): String {
25- return uri.toString()
29+ fun getPathFromUri (context : Context , uri : Uri ): String? {
30+ if (DocumentsContract .isDocumentUri(context, uri)) {
31+ if (isExternalStorageDocument(uri)) {
32+ val docId = DocumentsContract .getDocumentId(uri)
33+ val split = docId.split(" :" )
34+ return if (" primary" .equals(split[0 ], ignoreCase = true )) {
35+ " ${Environment .getExternalStorageDirectory()} /${split[1 ]} "
36+ } else {
37+ null
38+ }
39+ } else if (isDownloadsDocument(uri)) {
40+ val id = DocumentsContract .getDocumentId(uri)
41+ val contentUri = ContentUris .withAppendedId(
42+ Uri .parse(" content://downloads/public_downloads" ), java.lang.Long .valueOf(id))
43+ return getDataColumn(context, contentUri, null , null )
44+ } else if (isMediaDocument(uri)) {
45+ val docId = DocumentsContract .getDocumentId(uri)
46+ val split = docId.split(" :" )
47+ val contentUri: Uri ? = when (split[0 ]) {
48+ " image" -> MediaStore .Images .Media .EXTERNAL_CONTENT_URI
49+ " video" -> MediaStore .Video .Media .EXTERNAL_CONTENT_URI
50+ " audio" -> MediaStore .Audio .Media .EXTERNAL_CONTENT_URI
51+ else -> null
52+ }
53+ val selection = " _id=?"
54+ val selectionArgs = arrayOf(split[1 ])
55+ return getDataColumn(context, contentUri, selection, selectionArgs)
56+ }
57+ } else if (" content" .equals(uri.scheme, ignoreCase = true )) {
58+ return getDataColumn(context, uri, null , null )
59+ } else if (" file" .equals(uri.scheme, ignoreCase = true )) {
60+ return uri.path
61+ }
62+ return null
2663 }
2764
2865 fun getNameFromUri (context : Context , uri : Uri ): String? {
@@ -36,7 +73,7 @@ class FilePickerUtils {
3673 displayName = cursor.getString(columnIdx)
3774 cursor.close()
3875 }
39- if (displayName == null || displayName.isEmpty ()) {
76+ if (displayName.isNullOrEmpty ()) {
4077 displayName = uri.lastPathSegment
4178 }
4279 return displayName
@@ -162,4 +199,32 @@ class FilePickerUtils {
162199 return os.toByteArray()
163200 }
164201 }
165- }
202+ }
203+
204+ private fun getDataColumn (context : Context , uri : Uri ? , selection : String? , selectionArgs : Array <String >? ): String? {
205+ var cursor: Cursor ? = null
206+ val column = " _data"
207+ val projection = arrayOf(column)
208+ try {
209+ cursor = context.contentResolver.query(uri!! , projection, selection, selectionArgs, null )
210+ if (cursor != null && cursor.moveToFirst()) {
211+ val columnIndex = cursor.getColumnIndexOrThrow(column)
212+ return cursor.getString(columnIndex)
213+ }
214+ } finally {
215+ cursor?.close()
216+ }
217+ return null
218+ }
219+
220+ private fun isExternalStorageDocument (uri : Uri ): Boolean {
221+ return " com.android.externalstorage.documents" == uri.authority
222+ }
223+
224+ private fun isDownloadsDocument (uri : Uri ): Boolean {
225+ return " com.android.providers.downloads.documents" == uri.authority
226+ }
227+
228+ private fun isMediaDocument (uri : Uri ): Boolean {
229+ return " com.android.providers.media.documents" == uri.authority
230+ }
0 commit comments