filedescriptor用于在android中从外部存储渲染pdf文件
我已经在外部存储目录下下载了一个pdf文件,我想用android中的pdfrender重新编写它。 我已成功呈现保存在我的资产文件夹中的pdf,但现在我需要呈现保存在外部目录中的文件。这是我正在使用的代码filedescriptor用于在android中从外部存储渲染pdf文件,android,android-external-storage,pdfrenderer,Android,Android External Storage,Pdfrenderer,我已经在外部存储目录下下载了一个pdf文件,我想用android中的pdfrender重新编写它。 我已成功呈现保存在我的资产文件夹中的pdf,但现在我需要呈现保存在外部目录中的文件。这是我正在使用的代码 String filePath1=Environment.getExternalStorageDirectory().toString()+“/Mock-up-Presentation.pdf”; //filePath1是我要渲染的文件的位置 File File=新文件(filePath1);
String filePath1=Environment.getExternalStorageDirectory().toString()+“/Mock-up-Presentation.pdf”;
//filePath1是我要渲染的文件的位置
File File=新文件(filePath1);
mFileDescriptor=getActivity().getAssets().openFd(“sample.pdf”).getParcelFileDescriptor()//示例pdf保存在我已渲染//的项目中的资产文件夹中
//这是我们用来渲染PDF的PdfRenderer。
mPdfRenderer=新的PDFRender(mFileDescriptor)代码>
任何帮助都将不胜感激 如果您在针对android 9+的项目中遇到了这个问题,
获取解决方案的完整代码。
然后,您可以按照以下步骤操作:
步骤1:打开用于选择PDF文件的意图
/此代码将有助于打开Intent/
步骤2:现在捕获上述意图返回的结果
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==PDF_REQUEST_CODE && resultCode == Activity.RESULT_OK)
{
Uri uri=data.getData();
PdfRendererBasicViewModel pdfRendererBasicViewModel =new
ViewModelProvider(this).get(PdfRendererBasicViewModel.class);
pdfRendererBasicViewModel.setUri(uri);
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PdfRendererBasicFragment())
.commitNow();
}
}
步骤3:需要对pdfRendererBasicViewModel类进行一些修改。
首先,需要声明在viewmodel中设置/获取文件Uri的方法。
我们称之为setUri()。在onActivityResult()方法中
更新之后,将openPdfRenderer()方法替换为
私有静态Uri`
私有void openPdfRenderer()引发IOException{
if(getUri()!=null){
mFileDescriptor =
getApplication().getContentResolver().openFileDescriptor(getUri(), "r");
}
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
}`
现在试着跑
如果您想要一个完整的解决方案,那么如果您在针对android 9+的项目中遇到这个问题,您可以从github导入,
获取解决方案的完整代码。
然后,您可以按照以下步骤操作:
步骤1:打开用于选择PDF文件的意图
/此代码将有助于打开Intent/
步骤2:现在捕获上述意图返回的结果
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==PDF_REQUEST_CODE && resultCode == Activity.RESULT_OK)
{
Uri uri=data.getData();
PdfRendererBasicViewModel pdfRendererBasicViewModel =new
ViewModelProvider(this).get(PdfRendererBasicViewModel.class);
pdfRendererBasicViewModel.setUri(uri);
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PdfRendererBasicFragment())
.commitNow();
}
}
步骤3:需要对pdfRendererBasicViewModel类进行一些修改。
首先,需要声明在viewmodel中设置/获取文件Uri的方法。
正如我们在onActivityResult()方法中调用setUri()
更新之后,将openPdfRenderer()方法替换为
私有静态Uri`
私有void openPdfRenderer()引发IOException{
if(getUri()!=null){
mFileDescriptor =
getApplication().getContentResolver().openFileDescriptor(getUri(), "r");
}
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
}`
现在试着跑
如果您想要一个完整的解决方案,那么您可以从github导入在文件上打开一个FileInputStream
,然后在FileInputStream
上调用getFD()
以获取FileDescriptor
。我需要一个ParcelFileDescriptor将其传递给PdfRenderer().mFileDescriptor是ParcelFileDescriptorCall类型。不需要使用FileInputStream。我使用了这个=>mPdfRenderer=new PdfRenderer(ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_WRITE)),它工作正常。无论如何,谢谢:)文件表示文件的路径打开文件上的FileInputStream
,然后调用getFD()
在文件输入流上获取文件描述符
。我需要一个ParcelFileDescriptor将其传递给PdfRenderer()。那么,mFileDescriptor是ParcelFileDescriptorCall类型。不需要使用FileInputStream。我使用了它=>mPdfRenderer=new PdfRenderer(ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_WRITE)),它成功了。谢谢:)file表示文件的路径