【发布时间】:2016-01-05 09:24:19
【问题描述】:
我正在尝试使用手机的摄像头单击图像并尝试将图像保存在 sdcard 中的单独目录中。我尝试了很多方法,但总是得到 fileNotFoundException。我在清单中定义了以下两个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
以下是给我错误的代码:
private void captureImage() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
}
我的 onActivityResult 方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if the result is capturing Image
if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
Log.d("CameraDemo", "Pic saved");
if (data != null) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
postImage.setImageBitmap(photo); /* this is image view where you want to set image*/
Log.d("camera ---- > ", "" + data.getExtras().get("data"));
int count1 = count + 1;
createDirectoryAndSaveFile(photo, "" + userId + "_" + System.currentTimeMillis() + "mobileImageCapture" + count1);
}
}
}
创建目录和保存文件方法:
private void createDirectoryAndSaveFile(Bitmap imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/Toadways");
if (!direct.exists()) {
File wallpaperDirectory = new File("/sdcard/Toadways/");
wallpaperDirectory.mkdirs();
}
File file = new File(new File("/sdcard/Toadways/"), fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
我的崩溃日志:
W/System.err: java.io.FileNotFoundException: /sdcard/DirName/56332edfad441746cbd15000_1451985027984mobile
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
W/System.err: at toadways.ways.toad.toadways.ISayIPoll.createDirectoryAndSaveFile(ISayIPoll.java:1095
W/System.err: at toadways.ways.toad.toadways.ISayIPoll.onActivityResult(ISayIPoll.java:779)
W/System.err: at android.app.Activity.dispatchActivityResult(Activity.java:6456)
W/System.err: at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
W/System.err: at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
W/System.err: at android.app.ActivityThread.-wrap16(ActivityThread.java)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err: ... 15 more
我的清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
......
</application>
</manifest>
我的清单文件太大,所以我发布了它的一部分,这是需要的。
【问题讨论】:
-
可能
DirName不存在并且不是你创建的... -
@Jean-BaptisteYunès 如果 Dir 不存在,我正在使用 mkDirs 创建一个新的,所以它不应该显示该异常吗?
-
不是你创建的
/Toadways... -
@Jean-BaptisteYunès 对不起,我没找到你。
-
您从那时起编辑了代码!以前是
File file = new File(new File("/sdcard/DirName/"), fileName);,这导致了问题,因为DirName不存在,因为日志消息说...
标签: android file android-sdcard filenotfoundexception