我正在关注 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/