На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> Сохранение в пдф
    Добрый вечер.
    Я пытаюсь свое активити сохранить в пдф:
    ExpandedWrap disabled
      else if (id == R.id.print) {
       
                  PdfDocument document = new PdfDocument();
                  PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2250, 1400, 1).create();
                  PdfDocument.Page page = document.startPage(pageInfo);
                  LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  View content = inflater.inflate(R.layout.activity_main, null);
                  content.measure(1400, 2250);
                  content.layout(0,0, 2250, 1400);
                  content.draw(page.getCanvas());
                  document.finishPage(page);
                  String directory_path = Environment.getExternalStorageDirectory().getPath() + "/mypdf/";
                  File file = new File(directory_path);
                  if (!file.exists()) {
                      file.mkdirs();
                  }
                  String targetPdf = directory_path+"Табель.pdf";
                  File filePath = new File(targetPdf);
                  try {
                      document.writeTo(new FileOutputStream(filePath));
                      Toast.makeText(MainActivity.this, "Cохранено", Toast.LENGTH_LONG).show();
                  } catch (IOException e) {
                      Log.e("main", "error "+e.toString());
                      Toast.makeText(MainActivity.this, "Ошибка: " + e.toString(),  Toast.LENGTH_LONG).show();
                  }
                  document.close();

    Но он мне выдает ошибку:
    Ошибка: java.io.FileNotFoundException:/storage/emulfted/0/mypdf/Табель.pdf (Permission denied)
    Подскажите что не так может быть? Почему доступ запрещен?
      Я тебе об этом ответил ещё в теме с бмп.
      Сообщение отредактировано: Gonarh -
        Здесь проект целиком.
        https://yadi.sk/d/l2pXn1JkhVRsSw
        Выдает мне ошибку, что доступ запрещен.
          Запроси у системы права на запись на внешнее хранилище.
            Цитата Gonarh @

            А разве в манифесте строка:
            ExpandedWrap disabled
              <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

            Это не то? Сколько читал на форумах, везде писали что для получения права на запись на внешнее хранилище отвечает эта строка в манифесте.
              Это первое что надо сделать, затем ты должен в своем приложении проверить выдано ли фактически данное разрешение твоему приложению, и если нет, то вывести запрос на оный.
                Цитата Gonarh @
                Это первое что надо сделать, затем ты должен в своем приложении проверить выдано ли фактически данное разрешение твоему приложению, и если нет, то вывести запрос на оный.

                Подскажите. Мозг пипец уже кипит.
                Изменил функционал кнопки print.
                ExpandedWrap disabled
                  //Проверка версии SDK устройства
                              if (Build.VERSION.SDK_INT >= 19) {
                                  //динамическое получение прав на WRITE_EXTERNAL_STORAGE
                                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                      if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                                              == PackageManager.PERMISSION_GRANTED) {
                                          Toast.makeText(getApplicationContext(), "Разрешение предоставлено", Toast.LENGTH_SHORT).show();
                   
                                          PdfDocument document = new PdfDocument();
                                          PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2250, 1400, 1).create();
                                          PdfDocument.Page page = document.startPage(pageInfo);
                                          LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                          View content = inflater.inflate(R.layout.activity_main, null);
                                          content.measure(1400, 2250);
                                          content.layout(0,0, 2250, 1400);
                                          content.draw(page.getCanvas());
                                          document.finishPage(page);
                                          String directory_path = Environment.getExternalStorageDirectory().getPath() + "/Табель/";
                                          File file = new File(directory_path);
                                          if (!file.exists()) {
                                              file.mkdirs();
                                          }
                                          String targetPdf = directory_path+"Табель.pdf";
                                          File filePath = new File(targetPdf);
                                          try {
                                              document.writeTo(new FileOutputStream(filePath));
                                              Toast.makeText(MainActivity.this, "Cохранено", Toast.LENGTH_LONG).show();
                                          } catch (IOException e) {
                                              Log.e("main", "error "+e.toString());
                                              Toast.makeText(MainActivity.this, "Ошибка: " + e.toString(),  Toast.LENGTH_LONG).show();
                                          }
                                          document.close();
                   
                                      } else {
                                          Toast.makeText(getApplicationContext(), "В доступе отказано", Toast.LENGTH_SHORT).show();
                                          //запрашиваем разрешение
                                          ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                   
                                      }
                                  }
                              } else {
                                  PdfDocument document = new PdfDocument();
                                  PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2250, 1400, 1).create();
                                  PdfDocument.Page page = document.startPage(pageInfo);
                                  LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                  View content = inflater.inflate(R.layout.activity_main, null);
                                  content.measure(1400, 2250);
                                  content.layout(0,0, 2250, 1400);
                                  content.draw(page.getCanvas());
                                  document.finishPage(page);
                                  String directory_path = Environment.getExternalStorageDirectory().getPath() + "/Табель/";
                                  File file = new File(directory_path);
                                  if (!file.exists()) {
                                      file.mkdirs();
                                  }
                                  String targetPdf = directory_path+"Табель.pdf";
                                  File filePath = new File(targetPdf);
                                  try {
                                      document.writeTo(new FileOutputStream(filePath));
                                      Toast.makeText(MainActivity.this, "Cохранено", Toast.LENGTH_LONG).show();
                                  } catch (IOException e) {
                                      Log.e("main", "error "+e.toString());
                                      Toast.makeText(MainActivity.this, "Ошибка: " + e.toString(),  Toast.LENGTH_LONG).show();
                                  }
                                  document.close();
                              }

                Но ни как не могу понять.
                При первом нажатии кнопки мне отказано в доступе, и запрашиваем принудительно у пользователя. Но при разрешении, ничего не происходит. И уже после следующего нажатия создается и папка и файл. Правда открывая файл, там такая длиннющая квакозябра :) но это наверное из за русского языка, не могу понять пока как это исправить.
                И второе что смущает, что у меня создание папки и файла прописано дважды. Но если убираю условие else, он ничего не делает. Может что то не так делаю?
                  Цитата Vashnaemnik @
                  Но при разрешении, ничего не происходит.

                  И не будет, у тебя так в коде написано.
                    Цитата Gonarh @

                    Я вставлял после этого создание папки и файла, но он их не делает.
                    Помогите подправить код :) если конечно будете согласны.
                    И смущает, что после условия else мне надо снова повторять код. Но если условие убираю, то ничего не происходит. Не могу понять
                      То есть ты опять предлагаешь сделать работу за тебя? Один раз я уже так сделал, больше не буду. В чем ошибка, уже рассказал, дальше сам.
                      Сообщение отредактировано: Gonarh -
                        Цитата Gonarh @

                        Спасибо :) другого от вас я и не ждал :)
                        спасибо за подсказки

                        Добавлено
                        Цитата Gonarh @

                        а подсказку можно?
                        Если я уберу лишнее, сразу принудительно буду запрашивать разрешения и выполнять действие
                        ExpandedWrap disabled
                          ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                                      Toast.makeText(getApplicationContext(), "Разрешение предоставлено", Toast.LENGTH_SHORT).show();
                           
                                      PdfDocument document = new PdfDocument();
                                      PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2250, 1400, 1).create();
                                      PdfDocument.Page page = document.startPage(pageInfo);
                                      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                      View content = inflater.inflate(R.layout.activity_main, null);
                                      content.measure(1400, 2250);
                                      content.layout(0,0, 2250, 1400);
                                      content.draw(page.getCanvas());
                                      document.finishPage(page);
                                      String directory_path = Environment.getExternalStorageDirectory().getPath() + "/Табель/";
                                      File file = new File(directory_path);
                                      if (!file.exists()) {
                                          file.mkdirs();
                                      }
                                      String targetPdf = directory_path+"Табель.pdf";
                                      File filePath = new File(targetPdf);
                                      try {
                                          document.writeTo(new FileOutputStream(filePath));
                                          Toast.makeText(MainActivity.this, "Cохранено", Toast.LENGTH_LONG).show();
                                      } catch (IOException e) {
                                          Log.e("main", "error "+e.toString());
                                          Toast.makeText(MainActivity.this, "Ошибка: " + e.toString(),  Toast.LENGTH_LONG).show();
                                      }
                                      document.close();

                        Папка и файл создаются.
                        Но может есть какие нибудь подводные камни? может ли мне это как то боком выйти?
                          Ещё раз, у тебя фундаментальная ошибка, спрашивать разрешение в момент записи пдф. А если ты решишь делать запись пдф в десяти местах? Всё это говно у тебя будет повторяться 10 раз? Спрашивай один раз, сразу при старте приложения, и запрос на получение прав делай там же в случае отсутствия оных. При записи достаточно обрабатывать исключение в try/catch
                          Сообщение отредактировано: Gonarh -
                            Цитата Gonarh @
                            Ещё раз, у тебя фундаментальная ошибка, спрашивать разрешение в момент записи пдф. А если ты решишь делать запись пдф в десяти местах? Всё это говно у тебя будет повторяться 10 раз? Спрашивай один раз, сразу при старте приложения, и запрос на получение прав делай там же в случае отсутствия оных. При записи достаточно обрабатывать исключение в try/catch

                            Огромное спасибо за помощь.
                            А подскажите, сейчас он мне делает пдф файл корявый.
                            Как мне его перевести в нормальный вид?
                            Будет ли лучший результат ,если я буду делать скриншот экрана, и уже его сохранять в пдф?
                            Или есть более лучший способ?
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0341 ]   [ 15 queries used ]   [ Generated: 16.04.24, 13:38 GMT ]