Kauzmichi Shirai

ちょっと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をかざしたが、無反応だった。

SuicaはNFC-F

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

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

SuicaはNFC-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);