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
', 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
l'esprit élaborant un peu plus? –
Si j'essaie que je reçois contenu: //com.android.providers.downloads.documents./document/2443 –