parent
7ab95428b5
commit
ccd1b728e6
@ -1,135 +0,0 @@ |
|||||||
package com.frank.ffmpeg.util; |
|
||||||
|
|
||||||
import android.annotation.TargetApi; |
|
||||||
import android.content.ContentUris; |
|
||||||
import android.content.Context; |
|
||||||
import android.database.Cursor; |
|
||||||
import android.net.Uri; |
|
||||||
import android.os.Build; |
|
||||||
import android.os.Environment; |
|
||||||
import android.provider.DocumentsContract; |
|
||||||
import android.provider.MediaStore; |
|
||||||
|
|
||||||
public class ContentUtil { |
|
||||||
|
|
||||||
/** |
|
||||||
* Get a file path from a Uri. This will get the the path for Storage |
|
||||||
* Access Framework Documents. |
|
||||||
* @param context The context |
|
||||||
* @param uri The Uri to query |
|
||||||
*/ |
|
||||||
@TargetApi(Build.VERSION_CODES.KITKAT) |
|
||||||
public static String getPath(final Context context, final Uri uri) { |
|
||||||
|
|
||||||
// DocumentProvider
|
|
||||||
if (DocumentsContract.isDocumentUri(context, uri)) { |
|
||||||
// ExternalStorageProvider
|
|
||||||
if (isExternalStorageDocument(uri)) { |
|
||||||
final String docId = DocumentsContract.getDocumentId(uri); |
|
||||||
final String[] split = docId.split(":"); |
|
||||||
final String type = split[0]; |
|
||||||
|
|
||||||
if ("primary".equalsIgnoreCase(type)) { |
|
||||||
return Environment.getExternalStorageDirectory() + "/" + split[1]; |
|
||||||
} |
|
||||||
} |
|
||||||
// DownloadsProvider
|
|
||||||
else if (isDownloadsDocument(uri)) { |
|
||||||
|
|
||||||
final String id = DocumentsContract.getDocumentId(uri); |
|
||||||
final Uri contentUri = ContentUris.withAppendedId( |
|
||||||
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); |
|
||||||
|
|
||||||
return getDataColumn(context, contentUri, null, null); |
|
||||||
} |
|
||||||
// MediaProvider
|
|
||||||
else if (isMediaDocument(uri)) { |
|
||||||
final String docId = DocumentsContract.getDocumentId(uri); |
|
||||||
final String[] split = docId.split(":"); |
|
||||||
final String type = split[0]; |
|
||||||
|
|
||||||
Uri contentUri = null; |
|
||||||
if ("image".equals(type)) { |
|
||||||
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} else if ("video".equals(type)) { |
|
||||||
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} else if ("audio".equals(type)) { |
|
||||||
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} |
|
||||||
|
|
||||||
final String selection = "_id=?"; |
|
||||||
final String[] selectionArgs = new String[] { |
|
||||||
split[1] |
|
||||||
}; |
|
||||||
|
|
||||||
return getDataColumn(context, contentUri, selection, selectionArgs); |
|
||||||
} |
|
||||||
} |
|
||||||
// MediaStore (and general)
|
|
||||||
else if ("content".equalsIgnoreCase(uri.getScheme())) { |
|
||||||
return getDataColumn(context, uri, null, null); |
|
||||||
} |
|
||||||
// File
|
|
||||||
else if ("file".equalsIgnoreCase(uri.getScheme())) { |
|
||||||
return uri.getPath(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
/** |
|
||||||
** |
|
||||||
* Get the value of the data column for this Uri. This is useful for |
|
||||||
* MediaStore Uris, and other file-based ContentProviders. |
|
||||||
* |
|
||||||
* @param context The context |
|
||||||
* @param uri The Uri to query |
|
||||||
* @param selection (Optional) Filter used in the query. |
|
||||||
* @param selectionArgs (Optional) Selection arguments used in the query. |
|
||||||
* @return The value of the _data column, which is typically a file path. |
|
||||||
*/ |
|
||||||
private static String getDataColumn(Context context, Uri uri, String selection, |
|
||||||
String[] selectionArgs) { |
|
||||||
Cursor cursor = null; |
|
||||||
final String column = "_data"; |
|
||||||
final String[] projection = { |
|
||||||
column |
|
||||||
}; |
|
||||||
|
|
||||||
try { |
|
||||||
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, |
|
||||||
null); |
|
||||||
if (cursor != null && cursor.moveToFirst()) { |
|
||||||
final int index = cursor.getColumnIndexOrThrow(column); |
|
||||||
return cursor.getString(index); |
|
||||||
} |
|
||||||
} finally { |
|
||||||
if (cursor != null) |
|
||||||
cursor.close(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @param uri The Uri to check. |
|
||||||
* @return Whether the Uri authority is ExternalStorageProvider. |
|
||||||
*/ |
|
||||||
private static boolean isExternalStorageDocument(Uri uri) { |
|
||||||
return "com.android.externalstorage.documents".equals(uri.getAuthority()); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @param uri The Uri to check. |
|
||||||
* @return Whether the Uri authority is DownloadsProvider. |
|
||||||
*/ |
|
||||||
private static boolean isDownloadsDocument(Uri uri) { |
|
||||||
return "com.android.providers.downloads.documents".equals(uri.getAuthority()); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @param uri The Uri to check. |
|
||||||
* @return Whether the Uri authority is MediaProvider. |
|
||||||
*/ |
|
||||||
private static boolean isMediaDocument(Uri uri) { |
|
||||||
return "com.android.providers.media.documents".equals(uri.getAuthority()); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,124 @@ |
|||||||
|
package com.frank.ffmpeg.util |
||||||
|
|
||||||
|
import android.annotation.TargetApi |
||||||
|
import android.content.ContentUris |
||||||
|
import android.content.Context |
||||||
|
import android.database.Cursor |
||||||
|
import android.net.Uri |
||||||
|
import android.os.Build |
||||||
|
import android.os.Environment |
||||||
|
import android.provider.DocumentsContract |
||||||
|
import android.provider.MediaStore |
||||||
|
|
||||||
|
object ContentUtil { |
||||||
|
|
||||||
|
/** |
||||||
|
* Get a file path from a Uri. This will get the the path for Storage |
||||||
|
* Access Framework Documents. |
||||||
|
* @param context The context |
||||||
|
* @param uri The Uri to query |
||||||
|
*/ |
||||||
|
@TargetApi(Build.VERSION_CODES.KITKAT) |
||||||
|
fun getPath(context: Context, uri: Uri): String? { |
||||||
|
|
||||||
|
// DocumentProvider |
||||||
|
if (DocumentsContract.isDocumentUri(context, uri)) { |
||||||
|
// ExternalStorageProvider |
||||||
|
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 = true)) { |
||||||
|
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 getDataColumn(context, contentUri, selection, selectionArgs) |
||||||
|
}// MediaProvider |
||||||
|
// DownloadsProvider |
||||||
|
} 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 |
||||||
|
}// File |
||||||
|
// MediaStore (and general) |
||||||
|
return null |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* Get the value of the data column for this Uri. This is useful for |
||||||
|
* MediaStore Uris, and other file-based ContentProviders. |
||||||
|
* |
||||||
|
* @param context The context |
||||||
|
* @param uri The Uri to query |
||||||
|
* @param selection (Optional) Filter used in the query. |
||||||
|
* @param selectionArgs (Optional) Selection arguments used in the query. |
||||||
|
* @return The value of the _data column, which is typically a file path. |
||||||
|
*/ |
||||||
|
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 index = cursor.getColumnIndexOrThrow(column) |
||||||
|
return cursor.getString(index) |
||||||
|
} |
||||||
|
} finally { |
||||||
|
cursor?.close() |
||||||
|
} |
||||||
|
return null |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param uri The Uri to check. |
||||||
|
* @return Whether the Uri authority is ExternalStorageProvider. |
||||||
|
*/ |
||||||
|
private fun isExternalStorageDocument(uri: Uri): Boolean { |
||||||
|
return "com.android.externalstorage.documents" == uri.authority |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param uri The Uri to check. |
||||||
|
* @return Whether the Uri authority is DownloadsProvider. |
||||||
|
*/ |
||||||
|
private fun isDownloadsDocument(uri: Uri): Boolean { |
||||||
|
return "com.android.providers.downloads.documents" == uri.authority |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param uri The Uri to check. |
||||||
|
* @return Whether the Uri authority is MediaProvider. |
||||||
|
*/ |
||||||
|
private fun isMediaDocument(uri: Uri): Boolean { |
||||||
|
return "com.android.providers.media.documents" == uri.authority |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue