2013年2月3日日曜日

NFCタグを読み込む NdefMessage編

NDEF規格のNFCタグを読み込む方法をまとめます。

参考:NFCタグにURLを書き込む
http://baroqueworksdevjp.blogspot.jp/2013/02/nfcurl.html


Intent-filterの記載

NDEF規格のNFCタグをハンドリングするために、android.nfc.action.NDEF_DISCOVEREDを追加
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
</intent-filter>



IntentからNDEF情報を取得する

IntentのExtra情報:NfcAdapter.EXTRA_NDEF_MESSAGESから、NdefRecordを取得する。
if (getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
    Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(
            NfcAdapter.EXTRA_NDEF_MESSAGES);
    if (rawMsgs != null) {
        for (Parcelable pa : rawMsgs) {
            NdefMessage ndefMsg = (NdefMessage) pa;
            NdefRecord[] records = ndefMsg.getRecords();
            for (NdefRecord rec : records) {
                android.util.Log.e("", "NDEF toString = " + rec.toString());
                // Added in API level 16
                android.util.Log.e("", "NDEF toMimeType = " + rec.toMimeType());
                // Added in API level 16
                android.util.Log.e("", "NDEF toUri = " + rec.toUri());
            }
        }
    }
}

NdefRecord#toMimeType()とNdefRecord#toUri()はAPI Level 16から使用可能。
それ以前のAndroid versionの場合、自分で生成しないといけません。
以下のソースが参考になるかも。
\frameworks\base\core\java\android\nfc\NdefRecord.java


注意点

こんなバグがあるから気を付けよう。
Issue 36968: Scanning an NFC tag without a ndef record results in null pointer exception
http://code.google.com/p/android/issues/detail?id=36968

0 件のコメント:

コメントを投稿