読者です 読者をやめる 読者になる 読者になる

エンジニアの備忘録

仕事や趣味でのトラブルシューティングの備忘録

Android(Nexus 5)でSuicaのIDを読む

Android

ちょっとNexus 5でSuicaのIDを読み込む必要があったので、挑戦してみた。 Nexus 5のOSはAndroid4.4。

サンプルコードCard ReaderをDL

Android StudioのサンプルコードCard Readerをダウンロード。

"a low-level NFC card reader"と記載されているので、Suicaも読めると期待したが、このサンプルアプリを起動してSuicaをNexus 5をかざしたが、無反応だった。

SuicaNFC-F

Card Readerのコードを見てみると、ISO-DEP (ISO 14443-4)に対応しるらしい。

// Android's Host-based Card Emulation (HCE) feature implements the ISO-DEP (ISO 14443-4)
// protocol.

SuicaNFC-Fという規格(FはおそらくFelicaのF)に準拠しているので、このままのコードでは使えない。 NFC-F規格のNFCも読めるように変更していく。 /res/xmlにあるnfc_tech_filter.xml<tech>android.nfc.tech.NfcF</tech>を追加

<tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcF</tech>
</tech-list>

これで、SuicaをNexus 5にかざすと、 /com/example/android/cardreader/のLoyaltyCardReader.javaのonTagDiscovered(Tag tag)関数が呼び出されるようになる。 onTagDiscovered(Tag tag)関数にIDを読む処理を追加する。

        byte[] felicaIDm = tag.getId();
        if(felicaIDm != null) {
            //try {
            StringBuffer buffer = new StringBuffer();
            for(int i = 0; i < felicaIDm.length; i++) {
                buffer.append(String.format("%02x:", (Integer.valueOf(felicaIDm[i])&0xff)));
            }
                String cardID = buffer.toString();
                mAccountCallback.get().onAccountReceived(cardID);
                Log.i(TAG, "Felica ID: " + cardID);