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. 😉