Android 如何将MediaRecorder录制的视频长度读取到通过context.getFilesDir()构建的私有应用程序存储目录中?

Android 如何将MediaRecorder录制的视频长度读取到通过context.getFilesDir()构建的私有应用程序存储目录中?,android,android-camera,android-mediaplayer,android-video-player,android-mediarecorder,Android,Android Camera,Android Mediaplayer,Android Video Player,Android Mediarecorder,我在使用MediaRecorder读取设备摄像头录制的视频文件的长度/持续时间时遇到了一个奇怪的问题。文件被记录到应用程序的私有存储目录中,该目录的设置如下: mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp"); 录制完成后,我尝试使用以下方法读取视频长度: 方法1: 方法2: 这些方法都不管用mediaMetadataRetriever.extractMetadata返回null和Me

我在使用MediaRecorder读取设备摄像头录制的视频文件的长度/持续时间时遇到了一个奇怪的问题。文件被记录到应用程序的私有存储目录中,该目录的设置如下:

mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp");
录制完成后,我尝试使用以下方法读取视频长度:

方法1: 方法2: 这些方法都不管用
mediaMetadataRetriever.extractMetadata
返回null和
MediaPlayer.create
失败,出现IOException。我已验证该文件是否存在

重要提示:如果我将录音保存到“/sdcard/recordings/webcam.3gpp”,则不会发生此问题。由于某些原因,当文件位于属于应用程序的私有文件目录中时,我无法读取持续时间。此外,这个问题只发生在我的三星Droid Charge上,它运行Android 2.3。这在运行安卓4.2的三星Galaxy S4和运行安卓4.3的华硕Nexus 7上是不会发生的

编辑: 如果我把同一个文件复制到SD卡上,然后在那里读取它的长度,一切都正常。有什么好处

copy(new File(context.getFilesDir() + "/recordings/webcam.3gpp"), new File("/sdcard/wtfisthiscrap.3gpp"));
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource("/sdcard/wtfisthiscrap.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time); // works!

如何解决此问题?

我可以通过将
FileInputStream
设置为
MediaPlayer
的数据源来解决问题

MediaPlayer mp = new MediaPlayer();
FileInputStream stream = new FileInputStream(context.getFilesDir() + "/recordings/webcam.3gpp");
mp.setDataSource(stream.getFD());
stream.close();
mp.prepare();
long duration = mp.getDuration();
mp.release();
return duration;
我的答案来源于

copy(new File(context.getFilesDir() + "/recordings/webcam.3gpp"), new File("/sdcard/wtfisthiscrap.3gpp"));
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource("/sdcard/wtfisthiscrap.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time); // works!
MediaPlayer mp = new MediaPlayer();
FileInputStream stream = new FileInputStream(context.getFilesDir() + "/recordings/webcam.3gpp");
mp.setDataSource(stream.getFD());
stream.close();
mp.prepare();
long duration = mp.getDuration();
mp.release();
return duration;