Java.io.FileNotFoundException: /storage/emulated/0/MyPDFDocument/questions.pdf (такого файла или каталога нет)

Итак, я пытаюсь сохранить содержимое представления ресайклера в pdf-файле. Для этого я использовал PDFDocument класс. Я уже добавил разрешение.

uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"

Я не знаю, что я здесь делаю не так. Я пытался изменить расположение хранилища, но каждый раз возникала одна и та же ошибка.

Если кто-нибудь может сказать мне, что я здесь делаю не так. Вот соответствующий код:

  if (selectedId == R.id.action_save_pdf) {
        // create a new document
        PdfDocument document = new PdfDocument();

        // crate a page description
        PdfDocument.PageInfo pageInfo =
                new PdfDocument.PageInfo.Builder(100, 100, 1).create();

        // start a page
        PdfDocument.Page page = document.startPage(pageInfo);

        // finish the page
        document.finishPage(page);

        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            File root = Environment.getExternalStorageDirectory();
            File dir = new File(root.getAbsolutePath() + "/MyPDFDocument");
            if (!dir.exists()) {
                dir.mkdir();
            }
            File filePath = new File(dir, "questions.pdf");

            try {
                document.writeTo(new FileOutputStream(filePath));
                Toast.makeText(this, "Saved to PDF", Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(this, "Save Unsuccessful!",
                        Toast.LENGTH_LONG).show();
            }

        } else {
            Toast.makeText(this, "External Storage not available!", Toast.LENGTH_SHORT).show();
        }

        // close the document
        document.close();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Заранее благодарю.

Я думал, что эта строчка File filePath = new File(dir, "questions.pdf"); создает нужный файл.

Ron Daulagupu 05.04.2018 14:55

@sunilsunny Я пытался сделать то, что ты сказал. Все еще та же ошибка

Ron Daulagupu 05.04.2018 15:03
if (!dir.exists()) { dir.mkdir(); } Это должно быть: if (!dir.exists()) { if ( !dir.mkdir()) {Toast(... could not make dir ....); return;}; }. Кровать каталог не создается.
greenapps 05.04.2018 15:37

@sunil солнечный There should be something like filePath.createNewFile(); then only that file will be created. – sunil sunny 56 mins ago. Бред какой то. new FileOutputStream(filePath) создаст файл. Хорошо, если каталог существует и разрешения предоставлены.

greenapps 05.04.2018 15:39
thought this line File filePath = new File(dir, "questions.pdf"); creates the necessary file. Нет. Не будет. Но это тоже не нужно.
greenapps 05.04.2018 15:42

@greenapps Я попытался изменить это, и да, теперь я знаю, что каталог не создан, но почему он не создается? Я думал, что это делает команда dir.mkdir (). А также я добавил необходимое разрешение, как вы можете видеть, что я опубликовал выше. Итак, что мне не хватает?

Ron Daulagupu 05.04.2018 16:08
Thank You well in advance. Ну, я не могу сказать вам, как я люблю делать это до благодарности.
greenapps 05.04.2018 16:18

Позвольте нам продолжить обсуждение в чате.

Ron Daulagupu 05.04.2018 16:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
3 667
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

я нашел свой ответ. На самом деле в android уровень API> 23 вам нужно запросить разрешение на выполнение для WRITE_EXTERNAL_STORAGE. Поскольку он включен в опасные разрешения, вы должны предоставить разрешения времени выполнения, чтобы пользователь мог явно разрешить эти разрешения. Таким образом, просто добавить разрешение на запись во внешнее хранилище в манифесте не получится.

Ниже приведены ссылки, которые я использовал для решения моей проблемы.

https://developer.android.com/training/permissions/requesting.html#java

Ошибка разрешения хранилища в Marshmallow

Другие вопросы по теме