web-dev-qa-db-fra.com

android: ouvrir un pdf depuis mon application en utilisant le visionneur pdf intégré

C'était ma question initiale:

Je veux pouvoir ouvrir un fichier pdf dans mon application en utilisant l'Android intégré dans visionneuse pdf, mais je ne sais pas comment lancer d'autres applications. Je suis sûr que je dois appelez l'activité de démarrage, je ne sais tout simplement pas. comment identifier l'ouverture de l'application et comment passer le fichier à ce spécifique app.

Quelqu'un a un indice?

Je viens d'apprendre que le lecteur de pdf que j'ai sur mon téléphone est en fait fabriqué par HTC et que Adobe vient tout juste de sortir son lecteur de PDF Android (ce qui est génial). La nouvelle question est donc la suivante: comment puis-je vérifier que l'utilisateur a installé la visionneuse d'Adobe, puis comment puis-je ouvrir le fichier dans cette application à partir de mon application?

28
mtmurdock

D'après les informations dont je dispose, Adobe n'a documenté aucune Intents publique qu'il souhaite que les développeurs utilisent. 

Vous pouvez essayer une ACTION_VIEWIntent avec une Uri pointant sur le fichier (sur la carte SD ou MODE_WORLD_READABLE dans votre magasin de fichiers local) et un type MIME de "application/pdf".

16
CommonsWare

Vous pouvez déterminer par programme si une application appropriée existe sur le périphérique de l'utilisateur, sans intercepter les exceptions.

Intent intent = new Intent(Intent.ACTION_VIEW,
        Uri.parse("path-to-document"));
intent.setType("application/pdf");
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
if (activities.size() > 0) {
    startActivity(intent);
} else {
    // Do something else here. Maybe pop up a Dialog or Toast
}
39
Karakuri
private void loadDocInReader(String doc)
     throws ActivityNotFoundException, Exception {

    try {
                Intent intent = new Intent();

                intent.setPackage("com.Adobe.reader");
                intent.setDataAndType(Uri.parse(doc), "application/pdf");

                startActivity(intent);

    } catch (ActivityNotFoundException activityNotFoundException) {
                activityNotFoundException.printStackTrace();

                throw activityNotFoundException;
    } catch (Exception otherException) {
                otherException.printStackTrace();

                throw otherException;
    }
}
5
SALMAN
            FileFinalpath = SdCardpath + "/" + Filepath + Filename;
            File file = new File(FileFinalpath);
            if (file.exists()) {
                Uri filepath = Uri.fromFile(file);
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(filepath, "application/pdf");
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                try {
                    startActivity(intent);
                } catch (Exception e) {
                    alert.showAlertDialog(PDF_Activity.this, "File Not Started...","File Not Started From SdCard ", false);             
                    Log.e("error", "" + e);
                }

            } else {
                alert.showAlertDialog(PDF_Activity.this, "File Not Found...","File Not Found From SdCard ", false);             

            }
3
Karan Mavadhiya

Bien qu'il s'agisse d'un sujet assez ancien, voici une solution pour ouvrir un PDF qui se trouve dans l'actif/dossier avec une application de lecture PDF externe. Il utilise un fournisseur de contenu personnalisé: https://github.com/commonsguy/cwac-provider

Grâce à cela, vous pouvez définir n’importe quel fichier à fournir à partir du dossier assets/ou res/raw /.

Essayez le! La solution la meilleure et la plus simple que j'ai trouvée jusqu'à présent.

2
david.schreiber

Android a un cadre intégré à partir d'Android 5.0/Lollipop, il s'appelle PDFRenderer . Si vous pouvez supposer que vos utilisateurs disposent d’Android 5.0, c’est probablement la meilleure solution.

Il existe un exemple officiel sur le site de développement de Google:

http://developer.Android.com/samples/PdfRendererBasic/index.html

Il ne prend pas en charge les annotations ni d’autres fonctionnalités plus avancées; pour ceux que vous êtes vraiment de retour soit en utilisant une intention d'ouvrir une application complète, soit en incorporant un SDK tel que mupdf .

(Avertissement: je travaille très occasionnellement sur mupdf.)

1
JosephH

J'étais également confronté au même problème lorsque j'essayais d'afficher PDF sur un périphérique Android et que je finissais par obtenir la solution (intégration de librairie tierce PDF)

https://github.com/JoanZapata/Android-pdfview

alors que j'ai testé plusieurs bibliothèques pour cela énumérés ci-dessous qui fonctionnent également,

https://github.com/jblough/Android-Pdf-Viewer-Library

& mupdf qui vient avec la version ndk ( https://code.google.com/p/mupdf/downloads/detail?name=mupdf-1.2-source.Zip&can=2&q= ) et doit extraire avec NDK puis utilisez-le dans une application comme un pot ou en Java, etc. Un bel article explique l’utilisation de cette bibliothèque @ http://dixitpatel.com/integrating-pdf-in-Android-application/

1
paxbat

Ajouter FLAG_GRANT_READ_URI_PERMISSION

Intent intent = new Intent(Intent.ACTION_VIEW)
Uri outputFileUri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".provider", file); 
intent.setDataAndType(outputFileUri, "application/pdf"); 
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
Intent in = Intent.createChooser(intent, "Open File");
startActivity(in);

ajoutez également provider_paths.xml à res -> xml folder .__ et devez ajouter le code ci-dessous à manifestes.

<application>
   <provider
            Android:name="Android.support.v4.content.FileProvider"
            Android:authorities="${applicationId}.provider"
            Android:exported="false"
            Android:grantUriPermissions="true"
            tools:replace="Android:authorities">
            <meta-data
                tools:replace="Android:resource"
                Android:name="Android.support.FILE_PROVIDER_PATHS"
                Android:resource="@xml/provider_paths" />
        </provider>
 </application>
0
Rezaul Karim