🤖
JetpackComposeでFelica読み込みアプリを作った。
Felica読み込みアプリを作ったので備忘録とまとめ
今回作ったもの
NFCについてざっくり
- NFCとは近距離無線通信の規格のこと
- FelicaはSonyが推進しているNFCに準拠した方式
- 読み込むためにはPollingコマンドを実行して何やかんやする。
- 2byteとか16byteとかで管理されてるので変換する。
ざっくり解説
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.nfc_test">
<uses-permission android:name="android.permission.NFC" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
NFC機能を使えるようにするためにパーミッション追加
var nfcAdapter: NfcAdapter? = null
nfcAdapter = NfcAdapter.getDefaultAdapter(this)
NfcAdapterを用意して初期化
enableReaderModeで読み取り機能を呼び出して、
activity、callback,NFCの種類,なんかよくわからん(よくわからんのでnullでおk(ほんまか??))
を渡す。
nfcAdapter?.enableReaderMode(
activity,
MyReaderCallback(), // カスタムコールバック
NfcAdapter.FLAG_READER_NFC_F, // NFCの種類
null
)
こんな感じ。
読み込んだ後にどうのこうのしたい場合は、
コールバックをカスタムして処理する。
class MyReaderCallback : ReaderCallback {
override fun onTagDiscovered(tag: Tag) {
Log.d("Hoge", "Tag discoverd.")
//get idm
val idm = tag.id
val idmString = bytesToHexString(idm)
Log.d("Hoge", idmString)
id = idmString
if (id != "") {
nfcAdapter?.disableReaderMode(activity)
scope.launch { state.hide() }
}
}
}
fun bytesToHexString(bytes: ByteArray): String {
val sb = StringBuilder()
val formatter = Formatter(sb)
for (b in bytes) {
formatter.format("%02x", b)
}
return sb.toString().uppercase(Locale.getDefault())
}
今回はこんな感じ。
idmを取得したらbytesToHexString()で変換し、変換したもの返す。
値が取得できたらモーダルを閉じる。
みたいな事をしている。
参考記事
Discussion