Created
April 2, 2020 13:24
-
-
Save yesidlazaro/e7dee95333f93b8f2906d576e2199e84 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Get a file path from a Uri. This will get the the path for Storage Access | |
* Framework Documents, as well as the _data field for the MediaStore and | |
* other file-based ContentProviders. | |
* | |
* @param uri The Uri to query. | |
* @author paulburke | |
*/ | |
@TargetApi(Build.VERSION_CODES.KITKAT) | |
fun getPath(context: Context, uri: Uri): String? { | |
val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT | |
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { | |
if (isExternalStorageDocument(uri)) { | |
val docId = DocumentsContract.getDocumentId(uri) | |
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() | |
val type = split[0] | |
if ("primary".equals(type, ignoreCase = false)) { | |
return Environment.getExternalStorageDirectory().toString() + "/" + split[1] | |
} | |
} else if (isDownloadsDocument(uri)) { | |
val id = DocumentsContract.getDocumentId(uri) | |
val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)) | |
return getDataColumn(context, contentUri, null, null) | |
} else if (isMediaDocument(uri)) { | |
val docId = DocumentsContract.getDocumentId(uri) | |
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() | |
val type = split[0] | |
var contentUri: Uri? = null | |
if ("image" == type) { | |
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI | |
} else if ("video" == type) { | |
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI | |
} else if ("audio" == type) { | |
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI | |
} | |
val selection = "_id=?" | |
val selectionArgs = arrayOf(split[1]) | |
return contentUri?.let { getDataColumn(context, it, selection, selectionArgs) } | |
} | |
} else if ("content".equals(uri.scheme, ignoreCase = true)) { | |
return getDataColumn(context, uri, null, null) | |
} else if ("file".equals(uri.scheme, ignoreCase = true)) { | |
return uri.path | |
} | |
return null | |
} | |
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()) { | |
val columnIndex = cursor.getColumnIndexOrThrow(column) | |
return cursor.getString(columnIndex) | |
} | |
} catch (e: Exception) { | |
Logger.e(Constants.APP_NAME, e) | |
} 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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment