Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.135.182.158] |
|
Сообщ.
#1
,
|
|
|
Добрый вечер.
Я пытаюсь свое активити сохранить в пдф: 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) Подскажите что не так может быть? Почему доступ запрещен? |
Сообщ.
#2
,
|
|
|
Я тебе об этом ответил ещё в теме с бмп.
|
Сообщ.
#3
,
|
|
|
Сообщ.
#4
,
|
|
|
Запроси у системы права на запись на внешнее хранилище.
|
Сообщ.
#5
,
|
|
|
Цитата Gonarh @ А разве в манифесте строка: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> Это не то? Сколько читал на форумах, везде писали что для получения права на запись на внешнее хранилище отвечает эта строка в манифесте. |
Сообщ.
#6
,
|
|
|
Это первое что надо сделать, затем ты должен в своем приложении проверить выдано ли фактически данное разрешение твоему приложению, и если нет, то вывести запрос на оный.
|
Сообщ.
#7
,
|
|
|
Цитата Gonarh @ Это первое что надо сделать, затем ты должен в своем приложении проверить выдано ли фактически данное разрешение твоему приложению, и если нет, то вывести запрос на оный. Подскажите. Мозг пипец уже кипит. Изменил функционал кнопки print. //Проверка версии 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, он ничего не делает. Может что то не так делаю? |
Сообщ.
#8
,
|
|
|
Цитата Vashnaemnik @ Но при разрешении, ничего не происходит. И не будет, у тебя так в коде написано. |
Сообщ.
#9
,
|
|
|
Цитата Gonarh @ Я вставлял после этого создание папки и файла, но он их не делает. Помогите подправить код если конечно будете согласны. И смущает, что после условия else мне надо снова повторять код. Но если условие убираю, то ничего не происходит. Не могу понять |
Сообщ.
#10
,
|
|
|
То есть ты опять предлагаешь сделать работу за тебя? Один раз я уже так сделал, больше не буду. В чем ошибка, уже рассказал, дальше сам.
|
Сообщ.
#11
,
|
|
|
Цитата Gonarh @ Спасибо другого от вас я и не ждал спасибо за подсказки Добавлено Цитата Gonarh @ а подсказку можно? Если я уберу лишнее, сразу принудительно буду запрашивать разрешения и выполнять действие 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(); Папка и файл создаются. Но может есть какие нибудь подводные камни? может ли мне это как то боком выйти? |
Сообщ.
#12
,
|
|
|
Ещё раз, у тебя фундаментальная ошибка, спрашивать разрешение в момент записи пдф. А если ты решишь делать запись пдф в десяти местах? Всё это говно у тебя будет повторяться 10 раз? Спрашивай один раз, сразу при старте приложения, и запрос на получение прав делай там же в случае отсутствия оных. При записи достаточно обрабатывать исключение в try/catch
|
Сообщ.
#13
,
|
|
|
Цитата Gonarh @ Ещё раз, у тебя фундаментальная ошибка, спрашивать разрешение в момент записи пдф. А если ты решишь делать запись пдф в десяти местах? Всё это говно у тебя будет повторяться 10 раз? Спрашивай один раз, сразу при старте приложения, и запрос на получение прав делай там же в случае отсутствия оных. При записи достаточно обрабатывать исключение в try/catch Огромное спасибо за помощь. А подскажите, сейчас он мне делает пдф файл корявый. Как мне его перевести в нормальный вид? Будет ли лучший результат ,если я буду делать скриншот экрана, и уже его сохранять в пдф? Или есть более лучший способ? |