2017-03-07 30 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 

나는 파일이 존재 확신합니다,하지만 난 열린 우리당에서 얻는 경로가 I를 내가 대신 "MY_FILE.pdf"의 취득 파일 이름을 beign

/storage/emulated/0/document/2443

2443 따르고

또한 렌더러에 PDF 파일을 열려면 파일 이름을 얻을 수 있어야합니다, 나는 매니페스트

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
에 권한을 선언 한

그리고 수동으로 android M 이상의 권한을 묻는 메시지가 표시됩니다.

+0

'그러나 나는 열린 우리당에서 얻는 경로는 다음과 /저장되어/2443'// 0/문서를 에뮬레이트. 이것이 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