Translate

jeudi 25 juillet 2013

Download File

Dans ce tutoriel nous allons voir comment télécharger un document à partir de son url.
Le téléchargement doit se dérouler en arrière plan afin de ne pas bloquer l'application. Il est également utile de suivre l'évolution du téléchargement, et nous aurons aussi besoin de d'informer l'utilisateur que le téléchargement est terminé. C'est pour cela que nous utiliserons AsyncTask avec ces méthodes doInBackground, onProgressUpdate et onPostExecute .
L'information sur l'évolution du téléchargement sera affichée au niveau d'une Notification.


Pour télécharger le document :

String url = "URL du document à télécharger ou du WebService de téléchargement";
HttpGet httpget = new HttpGet(URIUtil.encodeQuery(url));
HttpResponse response;
DefaultHttpClient httpclient = new DefaultHttpClient();
response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() != 200) {
       throw new IOException();
}
HttpEntity entity = response.getEntity();
OutputStream output = new FileOutputStream(chemin du document à écrire);
Int count = -1;
while ((count = input.read(data)) != -1) {
       output.write(data, 0, count);
}
output.flush();
output.close();

input.close();

Pour les notifications, l'utilisation de AsyncTask consultez le projet suivant : https://github.com/DroiDev/DownloadDocument

Afficher une image à partir de son URL

Pour afficher une image dans un ImageView directement à partir de son URL nous écrirons une AsyncTask qui téléchargera l'image en arrière plan (ne bloque pas l'application). Une c'est fait cette AsyncTask affichera l'image à l'écran.

AsyncTask
public class ImagePreview extends AsyncTask<String, Integer, Object> {

       public ImagePreview() {
             super();
       }

       @Override
       protected final Bitmap doInBackground(final String... url) {
             Bitmap bitmap = null;
             try {
                    bitmap = BitmapFactory.decodeStream((InputStream) new URL(
                                        url[0]).getContent());
             } catch (MalformedURLException e) {
                    e.printStackTrace();
             } catch (IOException e) {
                    e.printStackTrace();
             }
             return bitmap;
       }

       @Override
       protected final void onPostExecute(final Object result) {
             super.onPostExecute(result);
             ImageView photo = (ImageView) findViewById(R.id.image_preview);
             if (result != null)
                    photo.setImageBitmap((Bitmap) result);
             else
                    Toast.makeText(getApplicationContext(), R.string.download_fail,
                                        Toast.LENGTH_LONG).show();
       }

}

Il ne reste plus qu'à appeler cette AsyncTask avec l'url de l'image
ImagePreview d = new ImagePreview();
d.execute(url de l'image à afficher);

Un exemple est disponible : https://github.com/DroiDev/DownloadDocument

samedi 4 mai 2013

Parcelable : Comment passer/communiquer un objet d'une classe à une autre

Sous Android, il est possible de faire passer des données d'une Activité à une autre en utilisant :


Intent intent = new Intent(this, ClassB.class);
intent.putExtra(Key, VALUE);
startActivity(intent);

Cependant VALUE peut être int, String, Boolean... mais ne peut être un objet.

Un moyen simple pour rendre possible la communication d'objets entre les Activités est d'implémenter, au niveau de la classe de l'objet, l'interface Parcelable

public class ParcelableObject implements Parcelable

Ajouter un constructeur prenant comme paramètre un Parcel

public ParcelableObject(Parcel in) {        

nom = in.readString();
prenom = in.readString();
mail = in.readString();
boolean droits[] = new boolean[1];
in.readBooleanArray(droits);
estEtudiant = droits[0];
age = in.readInt();

}

Ajouter une méthode qui va écrire l'objet en Parcel
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(nom);
dest.writeString(prenom);
dest.writeString(mail);
boolean droits[] = { estEtudiant };//Pour les boulean on ne peut passer qu'un BooleanArray
dest.writeBooleanArray(droits);
dest.writeInt(age);
}

Remarque très importante : L'ordre d'écriture dans le Parcel doit être le même au niveau de la lecture. Dans notre cas nom -> prenom -> mail -> estEtudiant ->age

Et enfin créer un Parcelable.Creator

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public ParcelableObject createFromParcel(Parcel in) {
     return new ParcelableObject(in);
     }

    public ParcelableObject[] newArray(int size) {
     return new ParcelableObject[size];
     }
};

 Au niveau de l'ActivitéA nous aurons :

ParcelableObject object = new ParcelableObject("Farouk", "f.ferjani.farouk@gmail.com", "FERJANI", false, 24);
Intent intent = new Intent(this, ClassB.class);
intent.putExtra(Key, object);
startActivity(intent);

 Au niveau de l'ActivitéB nous aurons :


Bundle extras = getIntent().getExtras();
if (extras != null) {
    ParcelableObject doc = extras.getParcelable(Key);
}
            
  Codecomplet de la classe ParcelableObject 

package com.example.tutoparcelable;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Document.
 *
 * @author Farouk
 *
 */
public class ParcelableObject implements Parcelable {
       private String nom = null;
       private String prenom = null;
       private String mail = null;
       private int age;
       private boolean estEtudiant;

       public ParcelableObject(final String prenom, final String mail,
                    final String nom, final boolean estEtudiant, final int age) {
             this.prenom = prenom;
             this.nom = nom;
             this.mail = mail;
             this.age = age;
             this.estEtudiant = estEtudiant;
       }

       public ParcelableObject(Parcel in) {
             readFromParcel(in);
       }

       public final String getNom() {
             return nom;
       }

       public final String getPrenom() {
             return prenom;
       }

       public final String getMail() {
             return mail;
       }

       public final int getAge() {
             return age;
       }

       public final boolean isEtudiant() {
             return estEtudiant;
       }

       @Override
       public void writeToParcel(Parcel dest, int flags) {
             dest.writeString(nom);
             dest.writeString(prenom);
             dest.writeString(mail);
             boolean droits[] = { estEtudiant };//Pour les boulean on ne peut passer qu'un BooleanArray
             dest.writeBooleanArray(droits);
             dest.writeInt(age);
       }

       private void readFromParcel(Parcel in) {
             nom = in.readString();
             prenom = in.readString();
             mail = in.readString();
             boolean droits[] = new boolean[1];
             in.readBooleanArray(droits);
             estEtudiant = droits[0];
             age = in.readInt();
       }

       @SuppressWarnings("rawtypes")
       public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
             public ParcelableObject createFromParcel(Parcel in) {
                    return new ParcelableObject(in);
             }

             public ParcelableObject[] newArray(int size) {
                    return new ParcelableObject[size];
             }
       };

       @Override
       public int describeContents() {
             // TODO Auto-generated method stub
             return 0;
       }
}