ちょっと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);