我在创建目录和保存图像时犯了什么错误

时间:2016-01-05 09:24:20

标签: android file android-sdcard filenotfoundexception

我正在尝试使用手机相机单击图像并尝试将图像保存在SD卡的单独目录中。我尝试了很多方法,总是得到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>

我的清单文件太大了,所以我发布了部分内容,这是必需的。

2 个答案:

答案 0 :(得分:1)

根据this answer检查现有内容后,如果它不存在,请创建它。

File folder = new File(Environment.getExternalStorageDirectory() + "/Your_Path");
boolean success = true;
if (!folder.exists()) {
    success = folder.mkdir();
}
if (success) {
    // Do something on success
} else {
    // Do something else on failure 
}

答案 1 :(得分:0)

我尝试优化代码。

您的代码现在看起来像这样:

    //If you are using Android Marshmallow, make sure storage permission is enabled.
    File direct = new File(Environment.getExternalStorageDirectory(), "Toadways");
    if (!direct.exists())
    {
        direct.mkdir();
    }
    File file = new File(direct, fileName);
    if (file.exists())
    {
        file.delete();
    }
    try
    {
        FileOutputStream out = new FileOutputStream(file.getPath());
        imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

另外,您忘记放置文件扩展名:

createDirectoryAndSaveFile(photo, "" + userId + "_" + System.currentTimeMillis() + "mobileImageCapture" + count1 + ".png")