filedescriptor用于在android中从外部存储渲染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);

我已经在外部存储目录下下载了一个pdf文件,我想用android中的pdfrender重新编写它。 我已成功呈现保存在我的资产文件夹中的pdf,但现在我需要呈现保存在外部目录中的文件。这是我正在使用的代码

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表示文件的路径