この記事を開いた皆さんは、タイトルのように Android 端末で Suica に触れたときにアプリが起動してUIDを読み取ろうとしている奇特な人だと思います。
NfcAdapter と言うクラスを利用することであれこれをお任せすることができます。
ここで重要になってくるのは、 Suica は NFC/Type-F と言うものです。 ので、プログラムのコード内で指定するときは そのように指定する必要があります。
作りたいもの
Pixel3a を使ってSuica(リアルカード)の上に触れたときに起動して読み取れるようにした。(挙動が一部おかしいけど)
— kuu /くぅ寿司大好き🍣🍶 (@Fumiya_Kume) 2019年10月12日
IDが読み取れるので今考えてる悪事を働くときに活用することができます。 pic.twitter.com/L3Ou0O1Usa
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>