1

我正在按照 Android 开发人员指南中的代码示例从我的应用程序中捕获视频。在我在实例上调用该prepare方法之前,一切都很顺利。MediaRecorder它会抛出IOException以下消息:

java.io.FileNotFoundException: /file:/storage/emulated/0/Pictures/MyApp/MyVideoFile.mp4: 
open failed: ENOENT (No such file or directory)

代码与网站上的代码几乎相同。总而言之,有:

  • CameraActivity用于管理 Camera 和 MediaRecorder 资源的类。

  • FileManager返回用于存储视频预览帧的输出文件路径的 Uri 类。

代码片段:

public static File getOutputMediaFile(int type) throws Exception {
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            throw new Exception("Unable to access device SDCard.");
        }

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), "MyApp");

    if(! mediaStorageDir.exists()) {
        if(! mediaStorageDir.mkdirs()) {
            Log.d(CameraActivity.MYAPP, "Failed to create directory.");
        }
    }

    // Create a media file name.
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath(),
        "MyAudioFile.jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath(),
        "MyVideoFile.mp4");
    } else {
        return null;
    }

    return mediaFile;
}

作为mediaFile参数传递给_mediaRecorder.setOutputFile()方法。但是,当我调用 时_mediaRecorder.prepare(),它会抛出IOException.

我已经包含<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />在 AndroidManifest 文件中。

令人惊讶的一点是,如果我省略mediaRecorder.prepare调用并检查 sdcard 是否存在文件,它就在那里!但是,如果我运行上述代码完成并检查文件夹,则该文件不存在。看来文件正在通过_mediaRecorder.prepare调用删除!

我对 Android 开发还很陌生,并且已经花了一天多的时间试图弄清楚这一点。任何帮助都将受到极大的重视!

4

2 回答 2

3

我已经关注了这个http://developer.android.com/guide/topics/media/camera.html#capture-video示例并且遇到了同样的问题。

那里的问题是,创建目录和构造文件名的方法返回了一个 File,但后来被另一个返回 Uri 的方法包装了。Uri 将“/file:”添加到文件路径字符串中。将 URI 返回的字符串传递给 mediaRecorder.setOutputFile(..),使准备函数调用引发异常。

我通过简单地获取视频文件并调用 ToString() 来获取它的路径并将其传递给 mediaRecorder.setOutputFile(..); 来修复它。然后 prepare() 工作

于 2014-09-08T15:29:56.220 回答
0

如果您使用的是模拟器,请将 SD 卡空间增加到 1024mb。还要检查您是否受此影响:WRITE_MEDIA_STORAGE http://www.chainfire.eu/articles/113/Is_Google_blocking_apps_writing_to_SD_cards_/

其他:https ://android.googlesource.com/platform/packages/providers/MediaProvider/+/android-4.1.2_r2.1/AndroidManifest.xml

于 2013-11-07T13:57:18.193 回答