やりたいこと
以下の記事で NFC タグをタッチしてアプリを起動するところまでできました。
[iOS][Android] NFCタグを使ってスマホアプリを起動する
次に、起動時にそのままタグを読み込みたいと思います。
事前準備
[iOS][Android] NFCタグを使ってスマホアプリを起動するを参照してください。
ホーム画面でNFCタッチすると、アプリが起動するまでの動作を行います。
起動時にタグ情報を読み込む対応
起動する ActivityのonCreate()で Intent を受け取り処理します。
NFC に書かれている Data(MIME) と AndroidManifest.xml の intent-filter が一致することで、アプリ起動時に ACTION_NDEF_DISCOVERED アクションを伴いActivityが起動されます。
private var nfcAdapter: NfcAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// NFC に書かれている Data(MIME) と AndroidManifest.xml の intent-filter が
// 一致することで、アプリ起動時に ACTION_NDEF_DISCOVERED アクションとなる
if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
// NDEF タグメッセージを取得する
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }
// メッセージから各レコードの情報を取得する
for (num in 0..(rawMessages.size-1)) {
(rawMessages[num] as NdefMessage).apply {
// 例として、Payload を読み込んでみる
records.forEach { ndefRecord ->
println( String(ndefRecord.payload))
}
}
}
}
}
}
Activityの launchMode が singleTop でない場合は onCreate() が呼ばれないこともあるので、その場合は onNewIntent()あたりでIntentを受け取ると良いようです。
実現できたこと
対象のアプリが前面にない場合に、NFCタグにAndroid端末をタッチすることで、アプリを起動。
その際にAndroidシステムが読み込んだタグの情報を、アプリが読み込む。
(起動後にNFCタグから離して、再タッチする必要がない)
後記
上記では、MIMEタイプのNDEFレコードを対象にしていましたが、NFCの基本 に書かれているように、他のタイプのレコードも対象とでき、その時にフォールバックされるアクションも3種類あります。
正直なところ、いくつかのパターンを試してみましたが、intent-filterの書き方が悪いのか、うまくいきませんでした。。。そのうち、気が向いたらまたチャレンジしてみたいと思います。