2017-03-07 46 views
0

我正在尝试制作PDF阅读器,允许用户从手机上打开PDF文件。Android:我无法从存储打开PDF文件

我开始通过做一个意图,让我来浏览文件

Intent openFileIntent = new Intent(Intent.ACTION_GET_CONTENT); 
openFileIntent.setType("*/*"); 
startActivityForResult(openFileIntent, FILE_OPEN_CODE); 

下面是onActivityResult:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == FILE_OPEN_CODE && resultCode == RESULT_OK && data != null){ 
     Uri selectedFile = data.getData(); 
     try { 
      openFile(selectedFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

一旦我有开放的,我把它发送到方法打开PDF:

public void openFile(Uri fileUri) throws IOException { 

    final int WIDTH = viewPDF.getWidth(); 
    final int HEIGHT = viewPDF.getHeight(); 
    String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + fileUri.getPath(); 
    Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444); 
    File pdfFile = new File(filePath); 
    Toast.makeText(getApplicationContext(), "Opened: " + filePath, Toast.LENGTH_LONG).show(); 
    PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)); 
    currentPage = 0; 
    Matrix matrix = viewPDF.getImageMatrix(); 
    Rect rect = new Rect(0, 0, WIDTH, HEIGHT); 
    renderer.openPage(currentPage).render(bitmap, rect, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
    viewPDF.setImageMatrix(matrix); 
    viewPDF.setImageBitmap(bitmap); 
} 

现在,问题是,我得到以下错误:

W/System.err: java.io.FileNotFoundException: No such file or directory 

我确信,该​​文件存在,但我从开放的获取路径是以下

/storage/emulated/0/document/2443

2443 beign文件名,我得到的,而不是“MY_FILE.pdf” 我需要能够得到的文件名,打开的渲染器的PDF

而且,我已经在清单

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
声明权限

并且还手动提示要求获取适用于Android M及更高版本的权限

+0

'但是我从开放的获取路径是以下 /存储/模拟/ 0 /文件/ 2443'。这是uri.getPath()的值。但是你最好看看使用uri.toString()获得的内容方案。 – greenapps

+0

介意多说一点? –

+0

如果我尝试获得 内容://com.android.providers.downloads.documents./document/2443 –

回答

0

您正在构建不存在且不可能的filePath。

您应该打开一个InputStream来读取文件。

InputStream is = getContentResolver().openInputStream(data.getData()); 
+0

介意多说一点? –

+0

我应该详细说明一下吗? – greenapps