2014-08-19 3 views
1
  • Требования: убедитесь, что документ 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.

ответ

0

Я до сих пор не знаю, почему это работает, но вот решение в случае, если кто-то работает в этот вопрос: Это каталог, в котором создается файл. По некоторым причинам на двух устройствах Samsung было что-то другое в том, как файлы были либо доступны, либо созданы по сравнению с устройством Asus. Таким образом, File path = new File(getExternalFilesDir(null).getAbsolutePath(), "temp"); становится File path = new File(getExternalCacheDir().getAbsolutePath());, и проблема уходит.

Смежные вопросы