Android canvas save всегда java.io.IOException: open failed: ENOENT (Нет такого файла или каталога)
У меня есть приложение для холста. Я пытаюсь создать приложение подписи с Canvas
+ onTouchListener
.
Это мой метод сохранения, где я пытаюсь сохранить подпись на изображении:
private void save() {
hideMenuBar();
View content = this;
content.setDrawingCacheEnabled(true);
content.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
Bitmap bitmap = content.getDrawingCache();
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
String imgPath = path+"/imotax/capture/spop/ttd/image" + "temp" + ".jpg";
File file = new File(imgPath);
FileOutputStream ostream;
try {
file.createNewFile();
ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, ostream);
ostream.flush();
ostream.close();
Toast.makeText(getContext(), "image saved", 5000).show();
} catch (Exception e) {
e.printStackTrace();
Log.i("ttd", e.toString());
Toast.makeText(getContext(), "Failed To Save", 5000).show();
showMenuBar();
}
}
Я не знаю почему, но он всегда ошибочно или вводит оператор catch
с этой ошибкой:
java.io.IOException: open failed: ENOENT (No such file or directory)
Ответы
Ответ 1
Попробуйте этот способ
private void save() {
try {
hideMenuBar();
View content = this;
content.setDrawingCacheEnabled(true);
content.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
Bitmap bitmap = content.getDrawingCache();
String extr = Environment.getExternalStorageDirectory().toString();
File mFolder = new File(extr + "/imotax/capture/spop/ttd/image");
if (!mFolder.exists()) {
mFolder.mkdir();
}
String s = "tmp.png";
File f = new File(mFolder.getAbsolutePath(), s);
FileOutputStream fos = null;
fos = new FileOutputStream(f);
bitmap.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
bitmap.recycle();
Toast.makeText(getContext(), "image saved", 5000).show();
} catch (Exception e) {
Toast.makeText(getContext(), "Failed To Save", 5000).show();
}
}
UPDATE
File mFolder = new File(extr + "/imotax/capture/spop/ttd/image"); //replace with
File mFolder = new File(extr + "/imotax");
Ответ 2
Add this permissions in manifest.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 3
промлем состоит в том, что вы пропускаете "/" между sdcard и 0
storage/sdcard0/imotax/capture/spop/ttd/image/tmp.png
should be
storage/sdcard/0/imotax/capture/spop/ttd/image/tmp.png
Ответ 4
Не спрашивайте меня, почему, но это, похоже, проблема с правами доступа. Попробуйте использовать какой-то общий каталог. Используя что-то вроде:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)