【问题标题】:barteksc:android-pdf-viewer:3.0.0-beta.5 - How to pdfview.fromFile(). FileNotFoundExceptionbarteksc:android-pdf-viewer:3.0.0-beta.5 - 如何 pdfview.fromFile()。 FileNotFoundException
【发布时间】:2020-12-26 11:36:56
【问题描述】:

我已经尝试了很多,并尝试了 Stackoverflow 和其他论坛上发布的所有解决方案,但没有运气。每种可能的方式都会给我 FieNotFoundException 错误的路径或错误的路径。

File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/my-pdf-file.pdf");
    pdfView.fromFile(pdfFile).load();

这就是我试图从 下载 文件夹中打开文件的方式。 注意:

  1. 我能够成功地从 Assets 文件夹加载文件。

  2. 我使用 Pixel 2 API R 作为 Android 模拟器。

  3. 我已将权限设置为

    使用权限 android:name="android.permission.WRITE_EXTERNAL_STORAGE" 使用权限 android:name="android.permission.READ_EXTERNAL_STORAGE"

这可能有助于回答。

2020-09-08 07:48:01.503 14928-14928/com.example.roohanikhazainp01 E/PDFView: load pdf error
java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
    at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:344)
    at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:231)
    at com.github.barteksc.pdfviewer.source.FileSource.createDocument(FileSource.java:37)
    at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:49)
    at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:25)
    at android.os.AsyncTask$3.call(AsyncTask.java:394)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)

我认为我缺少一些东西。请帮忙谢谢

【问题讨论】:

标签: java android pdf


【解决方案1】:

由于我使用的是 API 29、30,因此无法再使用访问外部存储

acceEnvironment.getExternalStorageDirectory()

所以我必须让用户选择使用它从外部驱动器打开 PDF。

Intent intentOpenPdf = new Intent((Intent.ACTION_OPEN_DOCUMENT));
intentOpenPdf.addCategory(Intent.CATEGORY_OPENABLE);
intentOpenPdf.setType("application/pdf");
intentOpenPdf.putExtra(DocumentsContract.EXTRA_INITIAL_URI, myBookPath);
startActivityForResult(intentOpenPdf, 786);

然后在函数onActivityResult()中。像这样将 Uri 获取到所选的 pdf 文件。

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == 786 && data != null) {
        myPdfUri = data.getData();
        pdfView.fromUri(myPdfUri).load();
    }
}

注意:你也可以保存这个Uri,这样用户就不用每次都选择PDF了。

我使用了这种方法。

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == 786 && data != null) {
       //Get the uri from data sent by Intent
        myPdfUri = data.getData();

       //Save the received uri for later use
       SharedPreferences sp = this.getPreferences(MODE_PRIVATE);
       SharedPreferences.Editor editor = sp.edit();
       editor.commit();
       getContentResolver().takePersistableUriPermission(myPdfUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        // Load the PDF using FromUri
        pdfView.fromUri(myPdfUri).load();
    }
}

那么一开始就可以检查uri是不是这样保存的。

List<UriPermission> permissions = getContentResolver().getPersistedUriPermissions();
       if(permissions.isEmpty())
        {
            openPDF(myBookPath);
        }else{
            try {
                SharedPreferences sp2 = getPreferences(MODE_PRIVATE);
                String myPdfUriString = sp2.getString("myPdfUri",""); // default is return if "myPdfUri" does not exist
                myPdfUri = Uri.parse(myPdfUriString);
                loadPdfView(null, myPdfUri, "");
            }catch (RuntimeException ex){
                Helper.Toaster(this, "Error : " + ex.getMessage());
            }
        }

这对我有用。谢谢

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 2017-02-04
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2021-11-04
    • 2017-11-29
    • 2023-04-02
    • 2021-08-04
    相关资源
    最近更新 更多