要从MediaStore中检索DATE_TAKEN信息,您可以使用以下代码示例来解决在Android 10+上无法检索DATE_TAKEN信息的问题:
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.CancellationSignal;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MediaStoreHelper {
public static List getAllMediaFiles(Context context) {
List mediaFiles = new ArrayList<>();
// 构建查询条件
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + " = " + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE
+ " OR " + MediaStore.Files.FileColumns.MEDIA_TYPE + " = " + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;
String sortOrder = MediaStore.Images.Media.DATE_TAKEN + " DESC";
// 在Android 10+上,需要使用EXTERNAL_CONTENT_URI进行查询
Uri queryUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
queryUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
} else {
queryUri = MediaStore.Files.getContentUri("external");
}
// 执行查询
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = null;
try {
cursor = contentResolver.query(
queryUri,
null,
selection,
null,
sortOrder,
new CancellationSignal()
);
// 遍历查询结果
if (cursor != null && cursor.moveToFirst()) {
do {
long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID));
Uri uri = ContentUris.withAppendedId(queryUri, id);
String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA));
// 根据需要,您可以在这里获取其他数据,如文件名、文件大小等
mediaFiles.add(new File(filePath));
} while (cursor.moveToNext());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
// 对结果进行排序(按日期降序)
Collections.sort(mediaFiles, new Comparator() {
@Override
public int compare(File file1, File file2) {
return Long.compare(file2.lastModified(), file1.lastModified());
}
});
return mediaFiles;
}
}
这个示例代码将返回一个包含所有媒体文件的列表,按照日期降序排列。您可以根据自己的需求进行进一步的处理和调整。请注意,这段代码仅在Android 10+上无法检索DATE_TAKEN信息时使用,对于较早的Android版本,仍然可以使用传统的查询方式。