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的主要内容,如果未能解决你的问题,请参考以下文章