Java barteksc:android pdf查看器:3.0.0-beta.5-如何使用pdfview.fromFile()。FileNotFoundException
我尝试了很多,尝试了Stackoverflow和其他论坛上发布的所有解决方案,但都没有成功。每一种可能的方法都给了我一个例外,要么是错误的路径,要么是错误的路径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(); 这就是我
File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/my-pdf-file.pdf");
pdfView.fromFile(pdfFile).load();
这就是我试图从下载文件夹打开文件的方式。
注:
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());
}
}
这对我有用。谢谢评论不用于扩展讨论;这段对话已经结束。