android-cursor没有';找不到\u数据列
当运行下面的代码来查询SD卡上的文件时,我总是得到一个空值android-cursor没有';找不到\u数据列,android,android-contentprovider,Android,Android Contentprovider,当运行下面的代码来查询SD卡上的文件时,我总是得到一个空值 public String getRealPathFromURI(Context context, Uri uri) { String fileName="unknown"; if (uri.getScheme().toString().compareTo("content") == 0) { Cursor cursor = context.getContentResolver().query(u
public String getRealPathFromURI(Context context, Uri uri)
{
String fileName="unknown";
if (uri.getScheme().toString().compareTo("content") == 0)
{
Cursor cursor = context.getContentResolver().query(uri,null,null,null,null);
if (cursor.moveToFirst())
{
Log.e(TAG, "dump cursor:" + DatabaseUtils.dumpCursorToString(cursor));
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
String name = cursor.getString(column_index);
if (name != null) {
uri = Uri.parse(cursor.getString(column_index));
fileName = uri.getLastPathSegment().toString();
}
}
}else if (uri.getScheme().compareTo("file") == 0){
fileName = uri.getLastPathSegment().toString();
}else {
fileName = fileName + "_" + uri.getLastPathSegment();
}
Log.e(TAG,"fileName:" + fileName);
return fileName;
}
媒体文件test.mp3已推送到SD卡,我可以从数据库中找到它
然后从游标转储中,我发现它实际上不包含_数据字段
11138 09-18 16:14:53.881 27848 27848 E MyExam : dump cursor:>>>>> Dumping cursor android.content.ContentResolver$CursorWrapperInner@9ab47b6
11139 09-18 16:14:53.881 27848 27848 E MyExam : 0 {
11140 09-18 16:14:53.881 27848 27848 E MyExam : document_id=primary:test.mp3
11141 09-18 16:14:53.881 27848 27848 E MyExam : mime_type=audio/mpeg
11142 09-18 16:14:53.881 27848 27848 E MyExam : _display_name=test.mp3
11143 09-18 16:14:53.881 27848 27848 E MyExam : last_modified=1441221715000
11144 09-18 16:14:53.881 27848 27848 E MyExam : flags=70
11145 09-18 16:14:53.881 27848 27848 E MyExam : _size=14400116
11146 09-18 16:14:53.881 27848 27848 E MyExam : }
11147 09-18 16:14:53.881 27848 27848 E MyExam : <<<<<
11138 09-18 16:14:53.881 27848 27848 E MyExam:dump cursor:>>>>>dump cursor android.content.ContentResolver$CursorWrapperInner@9ab47b6
11139 09-18 16:14:53.881 27848 27848 E MyExam:0{
11140 09-18 16:14:53.881 27848 27848 E MyExam:document_id=primary:test.mp3
11141 09-18 16:14:53.881 27848 27848 E MyExam:mime_type=audio/mpeg
11142 09-18 16:14:53.881 27848 27848 E MyExam:_display_name=test.mp3
11143 09-18 16:14:53.881 27848 27848 E MyExam:last_modified=1441221715000
11144 09-18 16:14:53.881 27848 27848 E MyExam:flags=70
11145 09-18 16:14:53.881 27848 27848 E MyExam:_size=14400116
11146 09-18 16:14:53.881 27848 27848 E MyExam:}
11147 09-18 16:14:53.881 27848 27848 E MyExam:最后,我理解了这是由不同的提供者引起的。我们需要添加逻辑来处理不同的提供者案例
下面的代码片段适合我(请参阅):
最后,我明白了这是由不同的供应商造成的。我们需要添加逻辑来处理不同的提供者案例
下面的代码片段适合我(请参阅):
您是否已尝试在projection参数中专门请求该列以查看其是否有效。@hoomi如果将该投影指定为MediaStore.Files.FileColumns.DATA,则结果将为null(_DATA=null)。我认为如果不使用project,它将返回所有列。@lucky1928我面临同样的问题。你解决了这个问题吗?如果是的话,你能告诉我这个问题的原因吗。@gman请粘贴你的java代码,然后我可以在我的设备上试用。我几乎删除了所有内容,因为它以前不起作用,但不确定您的案例是否与我的案例相同。您是否尝试在projection参数中专门请求该列,以查看其是否起作用。@hoomi如果将projection指定为MediaStore.Files.FileColumns.DATA,则结果将为null(_DATA=null)。我认为如果不使用project,它将返回所有列。@lucky1928我面临同样的问题。你解决了这个问题吗?如果是的话,你能告诉我这个问题的原因吗。@gman请粘贴你的java代码,然后我可以在我的设备上试用。我几乎删除了所有内容,因为它以前不起作用,但不确定你的案例是否与我的相同。
public String getPathFromUri(final Context context, final Uri uri) {
boolean isAfterKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
Log.e(TAG,"uri:" + uri.getAuthority());
if (isAfterKitKat && DocumentsContract.isDocumentUri(context, uri)) {
if ("com.android.externalstorage.documents".equals(
uri.getAuthority())) {// ExternalStorageProvider
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];
}else {
return "/stroage/" + type + "/" + split[1];
}
}else if ("com.android.providers.downloads.documents".equals(
uri.getAuthority())) {// DownloadsProvider
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);
}else if ("com.android.providers.media.documents".equals(
uri.getAuthority())) {// MediaProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
contentUri = MediaStore.Files.getContentUri("external");
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}else if ("content".equalsIgnoreCase(uri.getScheme())) {//MediaStore
return getDataColumn(context, uri, null, null);
}else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
return uri.getPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String[] projection = {
MediaStore.Files.FileColumns.DATA
};
try {
cursor = context.getContentResolver().query(
uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int cindex = cursor.getColumnIndexOrThrow(projection[0]);
return cursor.getString(cindex);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}