我正在尝试使用手机相机单击图像并尝试将图像保存在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>
我的清单文件太大了,所以我发布了部分内容,这是必需的。
答案 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")