くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Android 端末で Suica に触れたときにアプリが起動してUIDを読み取れるようにする

この記事を開いた皆さんは、タイトルのように Android 端末で Suica に触れたときにアプリが起動してUIDを読み取ろうとしている奇特な人だと思います。

NfcAdapter と言うクラスを利用することであれこれをお任せすることができます。

ここで重要になってくるのは、 Suica は NFC/Type-F と言うものです。 ので、プログラムのコード内で指定するときは そのように指定する必要があります。

作りたいもの

MainActivity.kt

private var mNfcAdapter: NfcAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mNfcAdapter = NfcAdapter.getDefaultAdapter(applicationContext)
    }

    override fun onResume() {
        super.onResume()

        val intent = Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)

        val intentFilterList = arrayOf(IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED))

        // Suica は Felica(Type-F) なのでそれを指定する
        val techList = arrayOf(
            arrayOf(android.nfc.tech.NfcF::class.java.name)
        )

        mNfcAdapter?.enableForegroundDispatch(this, pendingIntent, intentFilterList, techList)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)

        intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)?.let { tag ->
            Toast.makeText(applicationContext, tag.id.toString(), Toast.LENGTH_LONG).show()
        }
    }

Android Manifest ファイルをいい感じに設定すれば大丈夫でしょう。

<uses-permission android:name="android.permission.NFC" />
---
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>