我正在编写一个允许用户录制视频的 Android 应用程序,但需要一个准确的视频录制时间。我想用它来将视频与设备上的其他传感器信息相匹配。
要启动摄像机,我使用视频捕获意图:
private long intentTimestamp;
private void dispatchTakeVideoIntent() {
intentTimestamp = System.currentTimeMillis();
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO);
}
从摄像机返回时:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case ACTION_TAKE_VIDEO:
if (resultCode == Activity.RESULT_OK) {
// Get last recorded video from Gallery
String date = getLastVideo();
Log.d(TAG, "# onActivityResult: " + date);
Toast.makeText(this, "Start intent: " + intentTimestamp
+ ", video timestamp: " + date
+ ". Difference: " + ((Long.parseLong(date) - intentTimestamp) / 1000) + "s",
Toast.LENGTH_LONG).show();
} else if (resultCode == Activity.RESULT_CANCELED) {
Log.d(TAG, "# onActivityResult: Cancelled");
} else {
Log.d(TAG, "# onActivityResult: Video capture failed");
}
}
}
我调用一个函数来返回拍摄视频的日期:
private String getLastVideo() {
final Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
final String[] videoColumns = {
MediaStore.Video.VideoColumns.DATE_TAKEN
};
final String videoOrderBy = MediaStore.Video.Media._ID + " DESC";
Cursor videoCursor = getContentResolver().query(videoUri, videoColumns, null, null, videoOrderBy);
if (videoCursor != null) {
if (videoCursor.moveToFirst()) {
int dateColumn = videoCursor.getColumnIndex(MediaStore.Video.VideoColumns.DATE_TAKEN);
return videoCursor.getString(dateColumn);
} else {
Log.d(TAG, "# getLastVideo - videoCursor.moveToFirst() == false");
}
} else {
Log.d(TAG, "# getLastVideo - videoCursor == null");
}
videoCursor.close();
return null;
}
这使用 android MediaStore 获取拍摄日期(自 1970 年 1 月 1 日以来以毫秒为单位拍摄视频的日期和时间。)。
我现在正在测试两个 HTC One。一种安装了股票 HTC rom,另一种安装了 Google Edition rom。看来,在 GE rom 上,拍摄的日期对应于我开始录制视频的时间。但是,在 HTC rom 上,拍摄的日期对应于我结束录制的时间。
我可以从 MediaStore 获取视频的持续时间,我可以使用它来更正 HTC rom 值,但我如何在所有 Android 设备上系统地执行此操作?在其他地方我可以获得一致的视频日期(开始或结束)吗?我是否需要直接在我的应用程序中控制相机,例如控制相机?