2017-03-07 1 views
0

J'essaie de faire un lecteur PDF qui permet à l'utilisateur d'ouvrir un fichier PDF à partir du téléphone.Android: Je ne peux pas ouvrir un fichier PDF à partir du stockage

Je commence par faire une intention qui me permet de rechercher le fichier

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

Voici le 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(); 
     } 
    } 
} 

Une fois que je l'Uri, je l'envoyer à la méthode ouvre le 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); 
} 

maintenant, le problème est que je reçois l'erreur suivante:

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

Je suis sûr que le fichier existe, mais le chemin que je reçois de l'Uri est le suivant

/storage/emulated/0/document/2443

2443 beign le nom du fichier, je reçois au lieu de "MY_FILE.pdf" I doivent être en mesure d'obtenir le nom du fichier pour ouvrir le pdf sur le moteur de rendu

aussi, je l'ai déclaré autorisations dans le

manifeste
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

et également demandé manuellement pour les autorisations pour android M et ci-dessus

+0

', mais le chemin que je reçois de l'Uri est le suivant /stockage/émulé/0/document/2443'. C'est la valeur de uri.getPath(). Mais il vaut mieux regarder le schéma de contenu obtenu avec uri.toString(). – greenapps

+0

l'esprit élaborant un peu plus? –

+0

Si j'essaie que je reçois contenu: //com.android.providers.downloads.documents./document/2443 –

Répondre

0

Vous construisez un filePath inexistant et impossible.

Vous devez ouvrir un InputStream pour lire le fichier.

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

Esprit élaborant un peu plus? –

+0

Que devrais-je élaborer? – greenapps