RSS Feed

Archive de March, 2010

Au coeur du système Android – enregistrer les pièces jointes des MMS

23 March 2010 par SeB Pas de commentaire »

Continuons le tour du système Android avec un quatrième billet dans la série sur Au coeur du système Android.

Introduction

Aujourd’hui, nous allons nous pencher sur l’enregistrement des pièces jointes des MMS. Encore une fois, l’accès à ces fichiers n’est pas très documenté.

Solution

En partant du principe que nous savons lister les MMS et récupérer la liste des identifiants des pièces jointes pour un MMS, je vous propose le code à utiliser pour enregistrer ces fameuses pièces jointes (sur la carte mémoire par exemple).

try {
	//Récupère le flux de données de la pièce jointe à partir de son identifiant "partId"
	Uri partURI = Uri.parse("content://mms/part/" + partId);
	InputStream is = context.getContentResolver().openInputStream(partURI);
	//Génère le flux d'écriture de la pièce jointe
	OutputStream out = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/"+partId));
	byte[] buffer = new byte[512];
	int len = is.read(buffer);
	while (len >= 0) {
		out.write(buffer, 0, len);
		len = is.read(buffer);
	}
	out.close();
	is.close();
} catch (IOException e) {
	e.printStackTrace();
}

Il existe différentes façon de lister les SMS/MMS et donc de récupérer leur identifiant. Ceci est vrai également pour les pièces jointes d’un MMS. C’est pourquoi, je n’ai pas traité cette partie qui est suffisamment documentée dans la documentation officielle.

Conclusion

En résolvant ce problème, je me suis rendu-compte que les colonnes des fournisseurs de contenu dont le nom est “_data” sont des flux de données et doivent donc être récupérées de la même façon que les pièces jointes des MMS. Vous êtes donc paré pour affronter les méandres des fournisseurs de contenu et enregistrer tout un tas d’information comme les pièces jointes des MMS.

 

Au coeur du système Android – enregistrer une application dans un fichier APK

22 March 2010 par SeB 2 commentaires »

C’est au tour du troisième billet dans la série sur Au coeur du système Android.

Introduction

De très nombreuses personnes se demandent comment il est possible d’enregistrer une application installée sur un système Android dans un fichier au format APK.

Solution

Je vous propose un simple bout de code qui enregistre toutes les applications installées.

//Récupère la liste des applications installées
PackageManager appInfo = getPackageManager();
List<PackageInfo> list = appInfo.getInstalledPackages(PackageManager.GET_PROVIDERS);
for (PackageInfo pack : list) {
    if (pack.applicationInfo.publicSourceDir!=null) {
    	try {
 		//Construit le nom du fichier APK
 		String apkFileName = pack.applicationInfo.publicSourceDir.substring(pack.applicationInfo.publicSourceDir.lastIndexOf("/")+1);
 		InputStream in = new FileInputStream(new File (pack.applicationInfo.publicSourceDir));
 		//Enregistre le fichier APK sur la carte mémoire
 		OutputStream out = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/"+apkFileName));
 		int count = 0;
 		byte[] buf = new byte[512];
 		while ( (count = in.read(buf,0,512))!=-1) {
 			out.write(buf, 0, count);
 		}
 		out.close();
 		in.close();
 	} catch (FileNotFoundException e) {
 		e.printStackTrace();
 	} catch (IOException e) {
 		e.printStackTrace();
 	}
    }
}

Notez que seules les applications publiques peuvent être enregistrées sur la carte mémoire. En effet, Google propose moyennant finance de protéger une application publiée sur l’Android Market en la rendant privée. Ainsi, il n’est pas possible de l’enregistrer dans un fichier APK.

Conclusion

Ce genre de manipulation avec le système Android n’est pas très documentée. Beaucoup de développeurs se demandent comment le faire puisque certaines applications proposent de sauvegarder les applications installées au format APK sur la carte mémoire. Et bien maintenant vous saurez le faire ! ;-)

 

Au coeur du système Android – lister les applications installées

21 March 2010 par SeB 4 commentaires »

Voici le second billet dans la série sur Au coeur du système Android.

Introduction

Dès lors que l’on commence à écrire des applications système, il s’avère souvent utile de connaitre la liste des applications installées sur Android.

Solution

Je vous propose un simple bout de code qui trie et liste par nom toutes les applications installées.

//Récupère la liste des applications installées
PackageManager appInfo = getPackageManager();
List<ApplicationInfo> list = appInfo.getInstalledApplications(0);
//Trie les applications par leur nom d'affichage
Collections.sort(list, new ApplicationInfo.DisplayNameComparator(appInfo));

for (ApplicationInfo applicationInfo : list) {
  //Récupère le nom de l'application
  Log.i("ApplicationList", "application="+getPackageManager().getApplicationLabel(applicationInfo));
}

Rien de plus simple, non ? ;-)

Conclusion

Il existe plusieurs méthodes pour récupérer la liste des applications présentes sur le système Android. Cependant, toutes ces méthodes ne permettent pas d’afficher le nom des applications installées. Alors plutôt que de chercher dans la vaste API Android,vous avez maintenant un code simple pour lister des applications présentes sur votre téléphone Android.

 

Au coeur du système Android – créer une application cachée

20 March 2010 par SeB 2 commentaires »

Voici le premier billet dans la série sur Au coeur du système Android.

Introduction

Il y a quelques temps, je vous avais expliqué comment accéder à un menu caché dans Android. Cette astuce a sûrement donné des idées à certains d’entre vous. Et vous vous demandez donc : comment créer une application cachée dans Android ?

Solution

Partons du tutoriel officiel : Hello World. Il faut créer un récepteur d’écouter et traiter “les codes secrets” saisis sur le téléphone :

package com.example.helloandroid;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class HelloWorldReceiver extends BroadcastReceiver {
  private static String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";

  public void onReceive(Context context, Intent intent) {
    Log.i("HelloWorldReceiver", "intent.action="+intent.getAction());
    if (intent.getAction().equals(SECRET_CODE_ACTION)) {
      Intent i = new Intent(Intent.ACTION_MAIN);
      i.setClass(context, HelloWorld.class);
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      context.startActivity(i);
    }
  }
}

Vous pouvez voir que c’est le récepteur qui se charge de lancer l’application HelloWorld.

Ensuite, il faut modifier le fichier AndroidManifest.xml pour cacher l’application HelloWorld et paramétrer le code qui permet de lancer l’application :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.helloandroid"
      android:versionCode="1"
      android:versionName="1.0 (secret)">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HelloWorld"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <!-- category android:name="android.intent.category.LAUNCHER" /-->
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <receiver android:name=".HelloWorldReceiver">
            <intent-filter>
                 <action android:name="android.provider.Telephony.SECRET_CODE" />
                 <data android:scheme="android_secret_code" android:host="1337" />
            </intent-filter>
       </receiver>
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest>

L’application HelloWorld ne fait alors plus partie de la catégorie “launcher” mais “default”. Cela a pour conséquence qu’elle n’est plus visible dans la liste des applications du lanceur d’application.

Pour lancer l’application, il suffi d’ouvrir l’application de téléphonie et de composer le numéro suivant : *#*#1337#*#*. L’application HelloWorld se lance alors.

Conclusion

Vous êtes maintenant armé pour créer des applications invisibles. Il suffira juste d’indiquer à vos utilisateurs le code à saisir pour démarrer cette dernière. ;-)

 

Au coeur du système Android

19 March 2010 par SeB Pas de commentaire »

J’avais précédemment lancé coup sur coup deux séries d’articles intitulées Les bonnes pratiques avec Struts et Les bonnes pratiques avec Struts 2. A force de développer sur l’environnement Android, j’ai pensé à écrire une série du même type pour Android. Cependant, je ne suis pas encore convaincu de connaitre les bonnes pratiques. :-) Alors je vais l’appeler “A coeur du système Android”. Au final, cela revient au même puisque je vais partager avec vous des astuces et j’espère les bonnes pratiques que je peux utiliser lorsque je travaille sur Android.

L’objectif est double :

  • réaliser un aide mémoire sur l’utilisation d’Android
  • partager et confronter les expériences de chacun sur cette plateforme mobile

Liste des billets :

En attendant, prenez soin de vos petits androids ! ;-)

 

NormandyJUG – un sixième avec un air de déjà vu

18 March 2010 par SeB Pas de commentaire »

Ma bonne résolution du précédent compte-rendu du JUG n’a pas tenu longtemps puisque j’ai attendu un mois pour faire le compte-rendu du JUG. :-(

J’ai titré un “air de déjà vu” car ça faisait longtemps qu’une réunion n’avait pas autant débordée dans le temps. Ça doit remonter à la première réunion. ;-)

Lors de cette soirée, un seul et unique thème a été présenté par Dimitri Baeli et Nicolas Giard. Ils nous ont présenté Scrum, une méthode agile pour la gestion de projet. Au début de la présentation, quatre cobayes sont choisis pour réaliser une mise en pratique.

L’esprit agile

La méthode Scrum est venue d’un constat : il y a trop d’échec en développement.  De plus, le besoin évolue sur un projet d’un an ou plus. Afin de contrer ces effets, quatre valeurs ont été définies :

  • Interaction avec les personnes != process, outils
  • Produit opérationnel != documentations
  • Collaboration avec le client != négociation de contrat
  • Réactivité face au changement != suivi d’un plan

Scrum en cinq minutes (ou plus)

  • Une méthode agile
  • Un logiciel qui fonctionne à chaque sprint
  • Le métier défini les priorités : l’équipe s’organise elle-même
  • A la fin d’un sprint, tout le monde regarde le produit et dit s’il faut réitérer

Les rôles

  • Product owner : représentant du client
  • Scrum master : représentant le management du projet (un facilitateur)
  • L’équipe : cinq à dix personnes ayant tous les rôles qui ne change pas pendant un sprint

Meetings

  • Planification de sprint
  • Scrum quotidien
  • Revue de sprint
  • Rétrospective

Artefacts

  • Product backlog
  • Sprint backlog
  • Burndown chart

Cette méthode est intéressante. Elle met l’accent sur le besoin client. En revanche, la notion de planning ou de budget est complétement occultée. Ma remarque est peut-être provocatrice mais pas totalement sans fondement car cette approche doit être difficile à faire accepter au management ou au client :

  • Comment donner une vision sur l’occupation des charges quand il n’y a pas de planning ?
  • Comment le client peut-il savoir si son budget correspond à son besoin et s’il sera maitrisé ?

Il a y énormément de chose à dire sur le sujet. J’espère au moins avoir titillé votre curiosité. :-D

lire la suite…