Superdry Memorandom :-p

旧「superdry memorandum :-D」です

Android secret codeの実装方法

例えば、IMEI(端末識別番号)などは、ダイアラーから「*#06#」と入力すると表示されます。こんな感じに。

この「*#06#」のようなものがAndroid secret codeです。シークレットコードは、このIMEI表示のようにフレームワークで予約されたものもありますが、自分で作ることもできます。ダイアラーで「*#*#」で始まり「#*#*」で終わるコードなら、Broadcast Recieverで拾える仕組みがフレームワークで用意されてます。自分のアプリに隠し機能やイースターエッグ、あとデバッグモードへの切替機能をつけたい場合などにつかえます。

実装方法

シークレットコード「*#*#5963#*#*」を入力したら、秘密の画面を開くようなサンプルを作るとします。

  • AndroidManifest.xml
  • MainReceiver.java …シークレットコードを拾うReceiver
  • SecretActivity.java …秘密のActivity
AndroidManifest.xml

ダイアラーで入力したら、Androidフレームワークは「android_secret_code://」で始まるBroadcastIntentを投げます。例えば「*#*#5963#*#*」と入力したら、BroadcastIntentの内容は

  • ACTION名 : android.provider.Telephony.SECRET_CODE
  • data : android_secret_code://5963

なので、MainReceiverのintent-filterを以下のように設定します。

<receiver android:name=".MainReceiver">
	<intent-filter>
		<action android:name="android.provider.Telephony.SECRET_CODE" />
		<data android:scheme="android_secret_code" android:host="5963" />
	</intent-filter>
</receiver>
MainReceiver.java

普通にRecevierで拾ったあとの処理を実装します。ここでは、秘密の画面を開くためにSecretActivityにIntentを投げています。

public class MainRecevier extends BroadcastReceiver {

    private static String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SECRET_CODE_ACTION)) {
            Intent secretIntent = new Intent(context, SecretActivity.class);
            secretIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(secretIntent);
        }
    }
}
SecretActivity.java

ここではシークレットコード入れたあと開く画面を実装しています。

public class SecretActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		TextView tx = new TextView(this);
		tx.setText("Welcome to my secret page!");
		super.onCreate(savedInstanceState);
		setContentView(tx);
	}
}

結果

実装するとこんな感じ。

意外と簡単なので、いろんな隠し機能をしこんでみてください!ただし他のアプリとコードがかぶらないようにね。