gpt4 book ai didi

java - Android PDF 加载时序

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:30 24 4
gpt4 key购买 nike

  • 要求:确保用户离开 PDF 查看屏幕后,PDF 文档从设备中删除

    • 问题:在某些设备上(肯定是 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();
      }
      }

编辑:我还尝试实现回调以绝对确定 createFile() 已完成其工作。我什至尝试添加延迟(不同时间增量)以及为 Intent.FLAG_GRANT_READ_URI_PERMISSIONIntent.FLAG_GRANT_WRITE_URI_PERMISSIONIntent 添加(完全不必要的)标志。 FLAG_GRANT_PERSISTABLE_URI_PERMISSION

最佳答案

我仍然不知道为什么这有效,但以下是解决方案,以防其他人遇到此问题:这是创建文件的目录。由于某种原因,这两款三星设备的文件访问或创建方式与华硕设备有所不同。因此 File path = new File(getExternalFilesDir(null).getAbsolutePath(), "temp"); 变为 File path = new File(getExternalCacheDir().getAbsolutePath()); 然后问题就消失了。

关于java - Android PDF 加载时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25384285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com