在Android 10中,MediaStore的DATE_TAKEN字段返回null的问题是由于一些权限限制引起的。为了解决这个问题,你需要请求适当的权限并使用其他字段来获取图片的拍摄日期。
以下是一个示例代码,演示如何使用MediaStore.Images.Media.DATE_MODIFIED字段来获取图片的拍摄日期:
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class ImageUtils {
private static final String TAG = "ImageUtils";
public static List getImageDates(Context context) {
List imageDates = new ArrayList<>();
// 查询图片的URI和DATE_MODIFIED字段
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media.DATE_MODIFIED};
String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " DESC";
Cursor cursor = null;
ContentResolver contentResolver = context.getContentResolver();
try {
cursor = contentResolver.query(uri, projection, null, null, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
do {
// 从游标中获取日期
long dateModified = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED));
String imageDate = convertDate(dateModified);
imageDates.add(imageDate);
} while (cursor.moveToNext());
}
} catch (Exception e) {
Log.e(TAG, "Error retrieving image dates: " + e.getMessage());
} finally {
if (cursor != null) {
cursor.close();
}
}
return imageDates;
}
private static String convertDate(long dateModified) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
return formatter.format(new Date(dateModified * 1000));
}
}
在上面的代码中,getImageDates()方法会查询存储在设备上的所有图片,并使用DATE_MODIFIED字段获取图片的拍摄日期。convertDate()方法将日期转换为可读格式。
你需要在AndroidManifest.xml文件中添加以下权限:
然后,在你的Activity或Fragment中,通过调用以下方法来获取图片的拍摄日期:
List imageDates = ImageUtils.getImageDates(context);
这样,你就可以获取到图片的拍摄日期了。记得在使用这个代码之前,需要确保已经获取到了适当的权限。