mercredi 2 novembre 2011

Tutorial Android : Lire un fichier PDF de son application Androïd

Comment lire un fichier PDF de son application Android ?

Précaution : Une chose doit être claire et précisée : Dans notre application aucun code de lecture d'un fichier pdf est embarqué, nous utiliserons classiquement le travail entre application Androïd grâce aux intents.

Rappel : Un intent est un objet java qui permet de communiquer entre activités (ou services, broadcast receivers, ...). Dans le cas présent notre application appellera une activité lecteur pdf via un intent (Acrobat reader(tm) par exemple).

Il vous faut donc installer le lecteur PDF dans votre mobile en préalable. Je vous conseille 'acrobat reader' : le lecteur officiel.

Au cas où dans votre mobile plusieurs activités répondent à cet intent, au moment de l'ouverture Androïd vous demandera de choisir l'application.

1. Créez une application Android avec une seule activité.

2. Modifiez le fichier AndroidManifest.xml de manière à obtenir l'équivalent ci-dessous.
Remarque : Nous avons besoin de la permission internet pour lire via http. Si notre application ne lit pas de fichier sur le réseau, cette permission est inutile.

xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="ltm.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ReadPDFActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
    application>
manifest>


3. Le code ci-dessous décrit une activité, possédant un simple bouton. Sur l'événement click nous appellerons l'activité 'lecteur de fichier pdf'.

public class ReadPDFActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //
        Button b1 = (Button)findViewById( R.id.button1 );
        b1.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View arg0) {
String surl = "http://dsn/rep/fichier.pdf";
String apptype = "application/pdf";
if( openURLWithType( surl, apptype ) == false)
        Toast.makeText( ReadPDFActivity.this
     "Echec de Open URL", Toast.LENGTH_LONG ).show();
}});
    }
    
    public boolean openURLWithType( String url, String type ) { 
        Uri uri = Uri.parse(url);
        Intent intent = new Intent( Intent.ACTION_VIEW, uri );
        intent.setDataAndType( uri, type );
        intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
        try {
                ReadPDFActivity.this.startActivity(intent);
                return true;
        } catch (ActivityNotFoundException e) {
                Log.e( "LTM" ,"Activity not found: " + url, e);
        }
        return false;
    }
}


Quelques explications :
Tout se passe en fait dans la méthode openURLWithType(...) :

On crée un Intent avec une action Intent.ACTION_VIEW (spécifié dans le sdk Android).

On précise que notre Intent gère un type de donnée : application/pdf.

On utilise la classe Uri pour contenir notre url type : http://dsn/rep/fichier.pdf.

L'instruction startActivity(intent) cherche à lancer l'activité lecteur pdf. Si celle-ci est installée dans le device alors Androïd créera une instance de l'activité en question en lui passant l'Uri à afficher.

Vous devez donc gérer l'exception ActivityNotFoundException au cas où le lecteur n'est pas installé.

6 commentaires:

  1. slt mé il m'affiche toujours un erreur sur le lien malgrés qui est correct je ne sais pas c quoi le probléme svp un peut d'aide

    RépondreSupprimer
  2. Bon lorsque vous implémentez le code je reçois toujours l'ouverture d'erreur URL , j'ai changé pour un serveur et d'Internet et ne fonctionne pas .
    J'apprécie si vous me répondez merci .

    RépondreSupprimer
  3. Avez-vous un lecteur PDF sur le mobile ? Avez-vous ajouté la permission INTERNET dans le fichier manifest ? Essayez avec cette URL svp : ftp://ftp.remotesensing.org/proj/OF90-284.pdf

    RépondreSupprimer
  4. Vous pouvez utiliser aussi cette formule pour lancer l'activité :

    PackageManager pm = getPackageManager();
    List activities = pm.queryIntentActivities(intent, 0);
    if (activities.size() > 0) {
    startActivity(intent);
    } else {
    // ...
    }

    RépondreSupprimer
  5. j'ai la même erreur il mait tjs echec open url

    RépondreSupprimer
  6. bonjour,

    Dans le cas ou j'ai un ensemble de fichiers pdf, que je dois afficher, au fur et a mesure, comment programmer le lien de chaque bouton merci.

    RépondreSupprimer