一、Android读取视频metadata的拍摄时间
方式一(不符合要求)
使用MediaMetadataRetriever获取METADATA_KEY_DATE值;
result: 在Android华为9.0手机获取的到值,不过对应不上视频的拍摄时间(1904 UTC),在vivo6.0手机上没获取到;
查看了media_jni的一些cpp文件的代码,依然没法解决问题
方式二(不符合要求)
使用CursorLoader去获取,得到的也是null
private void loadVideoToShowInfo() {
CursorLoader cursorLoader = new CursorLoader(
this,MediaStore.Files.getContentUri("external"),new String[]{MediaStore.Video.VideoColumns.DATA,
MediaStore.Video.VideoColumns.MIME_TYPE,MediaStore.Video.VideoColumns.DISPLAY_NAME,
MediaStore.Video.VideoColumns.DATE_TAKEN,MediaStore.Video.VideoColumns.DATE_MODIFIED,
MediaStore.Video.VideoColumns.DATE_ADDED,MediaStore.Video.VideoColumns.TITLE,BaseColumns._ID},
MediaStore.Files.FileColumns.MEDIA_TYPE + "="+ MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO,
null, MediaStore.Video.VideoColumns.DATE_MODIFIED);
final Cursor cursor = cursorLoader.loadInBackground();
if (cursor == null) {return;}
AsyncTask.execute(new Runnable() {
@Override
public void run() {
if (cursor.moveToFirst()) {
do {Log.d(TAG,
new MediaVideoEntity(
cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATE_ADDED)),
cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA)),
cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.TITLE)),
cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATE_TAKEN)),
cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATE_MODIFIED))
).toString());
} while (cursor.moveToNext());
}
cursor.close();
}});
}
方式三(符合要求)
使用开源类FFmpegMediaMetadataRetriever读取METADATA_KEY_CREATION_TIME的值;
result:能得到正常的拍摄时间(第一次创建视频的时间)
build.gradle里加上:
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
private long getMetaCreationTimeFromVideo(String filePath) {
FFmpegMediaMetadataRetriever fFmpegMediaMetadataRetriever = new FFmpegMediaMetadataRetriever();
String creationTime = null;
try {
fFmpegMediaMetadataRetriever.setDataSource(filePath);
creationTime = fFmpegMediaMetadataRetriever.extractMetadata(
FFmpegMediaMetadataRetriever.METADATA_KEY_CREATION_TIME);
} catch (Exception e) {
Log.e(TAG, "FFmpegMediaMetadataRetriever.exception:" + e.toString());
} finally {
fFmpegMediaMetadataRetriever.release();
}
}
总结: MediaMetadataRetriever和FFmpegMediaMetadataRetriever的JNI层应该是不一样的
二、读取文件的第一次creationTime(需要Api26及26+)
需要Android系统8及以上(Api 26、26+)
private void getCreationTimeFromImage() {
String path = Environment.getExternalStorageDirectory().getPath() + "/tieba/熊猫头.jpg";
BasicFileAttributes attr = null;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
attr = Files.readAttributes(new File(path).toPath(),
BasicFileAttributes.class);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.d(TAG, "BasicFileAttributes ->creationTime: " + attr.creationTime());
Log.d(TAG, "BasicFileAttributes ->lastModifiedTime: " + attr.lastModifiedTime());
}
} catch (IOException e) {
Log.e(TAG, "BasicFileAttributes - failed:" + e.toString());
}
}
以上是本人的一些拙见,如大兄弟有更好的方法,希望不吝赐教,谢谢