概要
NFCタグをタッチして、自作アプリの特定アクティビティを表示させる方法を調べ、まとめた。
背景と目的
NFCタグをタッチすることで、特定のアクティビティを選択することができれば、使用状況に応じて、簡単に必要な画面を表示できる。そこで、特定のアクティビティを指定する方法を調べて、まとめる。
詳細
0.方法を簡単に箇条書き
いろいろ探し回った結果、以下の手順を行えばよいということがわかった。
- NFCタグに、アクティビティ選択のためのNDEFレコードを書き込む
- Manifestファイルへのインテントフィルタの記述
- デフォルトのアクティビティで、インテントとして渡されたNDEFレコードを解析しアクティビティを選択できるコードを実装
1.NFCタグ
アプリを起動するためのNFCタグは、通常、アプリケーションレコードというタイプのNDEFレコードを使う。しかし、これだけではアクティビティ選択の情報が何もないので、何らかのNDEFレコードにアクティビティ選択のための情報を追加する。自作アプリなので何でもいいと思うが、とりあえず一番簡単なテキストレコードを使う。ペイロードには、アクティビティ名を入れておく。(アクティビティが区別できればなんでもよい。)
2.Manifestファイル
次に、こちらによれば、Manifestファイルに、タグ読み取り時のインテントを受け取るためのインテントフィルタを設定する必要がある。
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
3.コーディング
2の記述により、デフォルトのアクティビティ渡されたインテントには、NFCタグのNDEFレコードが格納されているので、1で設定したテキストレコードを解析し、目的のアクティビティを選択するコードを書く。OnCreateメソッドに実装すれば、デフォルトのアクティビティ起動後、すぐに目的のアクティビティが表示できる。
// アクティビティに渡されたインテントを取得 Intent intent = this.getIntent(); // NDEFを取得し解析する Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (parcelables != null) { for (Parcelable parcelable : parcelables) { NdefMessage msg = (NdefMessage) parcelable; NdefRecord[] records = msg.getRecords(); for (NdefRecord record : records) { // ここで、テキストレコードを解析 // 条件に合致すれば、以下のように目的のアクティビティを // 開始する // レコードの解析方法はWeb各所等を参照 // Intent newIntent = new Intent(this, TargetActivity.class); // startActivity(newIntent); } } }
4.動作確認
上記の内容を自作アプリに適用し、タグをかざしたところ、無事目的のアクティビティが表示された。というわけで、成功!
まとめ
NFCタグをタッチして、自作アプリの特定アクティビティを表示させる方法を調べ、実装、動作確認することができた。