Требования: убедитесь, что документ PDF удаляется из устройства после того, как пользователь покинул экран просмотра PDFAndroid PDF Загрузить Timing
- Проблема: на некоторых устройствах (Samsung 4.4.2 и Samsung 4.1.2 точно, но не Asus 4.2.1) только первый раз, что PDF-запрос запрашивается после перезапуска приложения, отображается сообщение об ошибке «Этот документ не открывается». После этого PDF будет загружаться нормально. Я думаю, что это проблема времени из-за процессов, которые нужно запускать в первый раз, но работают после первой попытки загрузки.
Код: обратите внимание, что
createFile()
называется первым, а затемstartActivityForIntentResult()
private File file; private ArrayList<Uri> uriList = new ArrayList<Uri>(); private void createFile() { int fileNameLength = pdfFileName[0].length(); String fileName = pdfFileName[0].substring(0, fileNameLength - 4) + DateTime.now(); String fileExtension = pdfFileName[0].substring(fileNameLength - 4, fileNameLength); byte[] content = Base64.decodeBase64(pdfData[0].getBytes()); BufferedOutputStream outputStream = null; try { File path = new File(getExternalFilesDir(null).getAbsolutePath(), "temp"); if (!path.exists()) { path.mkdirs(); } file = new File(path, fileName + fileExtension); outputStream = new BufferedOutputStream(new FileOutputStream(file)); outputStream.write(content); file.deleteOnExit(); uriList.add(Uri.fromFile(file)); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } finally { try { if (outputStream != null) { outputStream.flush(); outputStream.close(); } } catch (IOException ex) { ex.printStackTrace(); } } } private static int REQUEST_CODE = 1; private Intent intent; private void startActivityForIntentResult() { if (file.exists()) { Uri targetUri = uriList.get(0); intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(targetUri, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); try { startActivityForResult(intent, REQUEST_CODE); } catch (ActivityNotFoundException e) { toastTitle = "Error Displaying PDF"; toastMessage = "Please make sure you have an application for viewing PDFs installed on your device and try again."; toast = new GenericCustomToast(); toast.show(toastTitle, toastMessage, QueryForPDF.this); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (resultCode == RESULT_CANCELED && requestCode == REQUEST_CODE) { if(!file.delete()) { file.delete(); } } searchAgain(); } @Override public void onBackPressed() { super.onBackPressed(); if(!file.delete()) { file.delete(); } searchAgain(); } @Override public void onStop() { super.onStop(); if(!file.delete()) { file.delete(); } } @Override public void onDestroy() { super.onDestroy(); if(!file.delete()) { file.delete(); } }
EDIT: Я также попытался реализации обратного вызова, чтобы быть абсолютно уверенным, что createFile()
закончил свою работу. Я даже попытался добавить задержки (с разными временными шагами), а также добавить (совершенно ненужные) флаги для Intent.FLAG_GRANT_READ_URI_PERMISSION
, Intent.FLAG_GRANT_WRITE_URI_PERMISSION
и Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
.