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

标签 java android eclipse video-capture ioexception

我正在关注 Android 开发人员指南中的代码示例 capturing video从我的应用程序。在我调用 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 的类 用于存储视频预览帧。

代码 fragment :

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打电话检查 SD 卡是否存在该文件,它就在那里!但是,如果我运行上面的代码完成并检查文件夹,则该文件不存在。文件似乎被 _mediaRecorder.prepare 删除了打电话!!

我是 Android 开发的新手,已经花了一天多的时间试图解决这个问题。任何帮助将不胜感激!!

最佳答案

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

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

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

关于java - 尝试访问外部存储 Android 时出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621684/

相关文章:

java - 将ckan许可证添加到从java上传的文件中

java - 如何创建持久的 Android 服务

java - Swing 进度条通过 Worker 更新到 EventDispatch 线程

java - Eclipse 删除了我的 3 个项目

java - 可比较<类型>数组 VS 可比较数组

android - 关于将 Flutter 应用发布到 Play 商店的问题

当子元素展开/折叠时,Android RecyclerView 滚动到顶部

android - 使用 MaterialComponents 主题后的 BottomSheet 样式

java - Maven 不会从谷歌存储库下载 jar

java - 在eclipse上安装逆时针插件失败