CreateNewFile - open failed: ENOENT (Нет такого файла или каталога)
Я не могу понять, что здесь не так. Я пробовал писать это более сугубо, это не сработало. Я добавил все лишние строки после прочтения других предложений с этой проблемой. Не помогает. Не знаю, что происходит. Может быть, это связано с разрешениями? AFAIK Я пытаюсь записать во внутреннюю память и не нуждается в специальных разрешениях?
public void outputBitmap(){
String path = Environment.DIRECTORY_PICTURES.toString();
File folder = new File(path + "/Blabla");
String filename = new SimpleDateFormat("yyMMddHHmmss").format(Calendar.getInstance().getTime()) + ".png";
try {
if (!folder.exists()) {
folder.mkdirs();
System.out.println("Making dirs");
}
File myFile = new File(folder.getAbsolutePath(), filename);
myFile.createNewFile();
FileOutputStream out = new FileOutputStream(myFile);
myBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Каждый раз он "Делает диски", каталог не остается или что-то еще. Когда он попадает в myFile.createNewFile(); он дает сообщение об ошибке "open failed: ENOENT (Нет такого файла или каталога)"
Не уверен, что это связано, но информация, которую я пытаюсь вывести, - это:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
myBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565);
Canvas pngCanvas = new Canvas(myBitmap);
...[some maths and stuff]
canvas.drawLine(...);
pngCanvas.drawLine(...);
}
Я думал, что должен использовать тот же холст для растрового изображения, но это вызвало сбой, поэтому я пишу одну и ту же информацию на оба холста. Итак... я не знаю, связано ли это с проблемой или совершенно другой плохой проблемой или что.
Изучал всевозможные вопросы, которые казались похожими, но не могли найти решений, которые работали для меня. Я пытался решить это уже несколько дней. Кто-нибудь знает, что происходит не так?
Спасибо
Ответы
Ответ 1
Вы не используете Environment.DIRECTORY_PICTURES правильно. Это не папка сама по себе, вам нужно использовать ее как параметр для метода getExternalStoragePublicDirectory().
Отметьте здесь: http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory(java.lang.String)
Ответ 2
Возможная проблема:
Убедитесь, что вы предоставили следующие необходимые разрешения в вашем файле манифеста.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
И для устройств Marhsmallow убедитесь, что группы контактов разрешены также пользователям устройства.
Ссылка: http://developer.android.com/training/permissions/requesting.html
Ответ 3
Просто измените начало кода:
public void outputBitmap(){
String path = Environment.DIRECTORY_PICTURES.toString();
File folder = new File(path + "/Blabla");
Для этого:
public void outputBitmap(){File folder = new File(getActivity().getExternalFilesDir(null) + IMAGE_DIRECTORY + "whatever you want for your directory name");