尝试访问Android外部存储时出现FileNotFoundException

时间:2013-10-27 18:23:00

标签: java android eclipse video-capture ioexception

我正在关注我的应用中的capturing video 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

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

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

我对Android开发很陌生,已经花了一天多时间试图解决这个问题。任何帮助都将受到极大的重视!!

2 个答案:

答案 0 :(得分:3)

我已遵循此http://developer.android.com/guide/topics/media/camera.html#capture-video示例并遇到同样的问题。

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

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

答案 1 :(得分: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