Skip to content

Commit 4cd8112

Browse files
authored
fix(dialog): open function return mismatch (#1056)
* Implemented conversion of URI to a file path * Added relevant .changes file
1 parent fc3667d commit 4cd8112

3 files changed

Lines changed: 75 additions & 5 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"dialog": "patch"
3+
---
4+
5+
Fixed an issue where dialogs on android would return the Content URI instead of the file path

plugins/dialog/android/src/main/java/DialogPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
141141
fileResult.put("modifiedAt", modifiedAt)
142142
}
143143
fileResult.put("name", FilePickerUtils.getNameFromUri(activity, uri))
144-
fileResult.put("path", FilePickerUtils.getPathFromUri(uri))
144+
fileResult.put("path", FilePickerUtils.getPathFromUri(activity, uri))
145145
fileResult.put("size", FilePickerUtils.getSizeFromUri(activity, uri))
146146
filesResultList.add(fileResult)
147147
}

plugins/dialog/android/src/main/java/FilePickerUtils.kt

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44

55
package app.tauri.dialog
66

7+
8+
import android.content.ContentUris
9+
import android.database.Cursor
10+
import android.provider.MediaStore
711
import android.content.Context
812
import android.graphics.BitmapFactory
913
import android.media.MediaMetadataRetriever
1014
import android.net.Uri
15+
import android.os.Environment
1116
import android.provider.DocumentsContract
1217
import android.provider.OpenableColumns
1318
import 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

Comments
 (0)