barteksc:android-pdf-viewer:3.0.0-beta.5 - 如何 pdfview.fromFile()。 FileNotFoundException

Posted

技术标签:

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

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

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

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

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

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

    我已将权限设置为

    使用权限 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)

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

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案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());
            
        

这对我有用。谢谢

【讨论】:

以上是关于barteksc:android-pdf-viewer:3.0.0-beta.5 - 如何 pdfview.fromFile()。 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章