Java barteksc:android pdf查看器:3.0.0-beta.5-如何使用pdfview.fromFile()。FileNotFoundException

Java barteksc:android pdf查看器:3.0.0-beta.5-如何使用pdfview.fromFile()。FileNotFoundException,java,android,pdf,Java,Android,Pdf,我尝试了很多,尝试了Stackoverflow和其他论坛上发布的所有解决方案,但都没有成功。每一种可能的方法都给了我一个例外,要么是错误的路径,要么是错误的路径 File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/my-pdf-file.pdf"); pdfView.fromFile(pdfFile).load(); 这就是我

我尝试了很多,尝试了Stackoverflow和其他论坛上发布的所有解决方案,但都没有成功。每一种可能的方法都给了我一个例外,要么是错误的路径,要么是错误的路径

File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/my-pdf-file.pdf");
    pdfView.fromFile(pdfFile).load();
这就是我试图从下载文件夹打开文件的方式。 注:

  • 我能够成功地从资产文件夹加载文件

  • 我使用Pixel2APIRandroid模拟器

  • 我已将权限设置为

    使用权限android:name=“android.permission.WRITE\u外部存储” 使用权限android:name=“android.permission.READ\u外部存储”

  • 这可能有助于asnwering

    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)
    

    我想我遗漏了一些东西。感谢您的帮助

    因为我使用的是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()中。像这样获取所选pdf文件的Uri

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if (requestCode == 786 && data != null) {
            myPdfUri = data.getData();
            pdfView.fromUri(myPdfUri).load();
        }
    }
    
    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());
                }
            }
    
    注意:您还可以保存此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是否是这样保存的

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if (requestCode == 786 && data != null) {
            myPdfUri = data.getData();
            pdfView.fromUri(myPdfUri).load();
        }
    }
    
    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());
                }
            }
    
    List permissions=getContentResolver().GetPersistedUserPermissions();
    if(permissions.isEmpty())
    {
    openPDF(myBookPath);
    }否则{
    试一试{
    SharedReferences sp2=getPreferences(模式\私有);
    String myPdfUriString=sp2.getString(“myPdfUri”和“”);//如果“myPdfUri”不存在,则默认为返回值
    myPdfUri=Uri.parse(myPdfUriString);
    loadPdfView(null,myPdfUri,“”);
    }捕获(RuntimeException ex){
    Toaster(这个“错误:+ex.getMessage());
    }
    }
    

    这对我有用。谢谢

    评论不用于扩展讨论;这段对话已经结束。