2013/01/13

[android]NDEF_DISCOVERED指定してもTECH_DISCOVEREDが来ることがあるのは仕様

Nexus7で、自作NDEFタグを読み込ませようとしている。
私はACTION_NDEF_DISCOVEREDだけしか指定していないのだが、ACTION_TECH_DISCOVEREDのintentが飛んでくるので悩んでいた。

が、それは仕様だった。

i.2 高度な NFC - ソフトウェア技術ドキュメントを勝手に翻訳 (原文)

 

Categoryなどを指定せずにSmartPosterのNFCカードをかざしてみたが、やっぱりTECH_DISCOVEREDになっていた。


さて、原文を見ると「could not be mapped to a MIME or URI」とある。
翻訳されている文章だと「MIMEやURIにマップできなかった場合」と書かれているので、何となく「他にもマップできるものがあるのだろう」と読んでしまったのだが、もしかすると「MIMEURIに」なのかもしれない。
なんでこんなことを言い出したかというと、Static HandoverのNDEFはWell-knownなNDEF Recordタイプではあるものの、MIMEでもURIでもないからだ。

ごにょごにょ考えていたが、ちゃんと書いてあった
うん、順番に読みなさい、ということかな。

 

Static Handoverの場合、ALTERNATIVE_CARRIERを含んだHANDOVER_SELECTと、MIME(RFC2046)になる。
どうも、これらはTECH_DISCOVERED扱いになるようだ。

public static final short TNF_WELL_KNOWN = 0x01;
public static final short
TNF_MIME_MEDIA = 0x02;
public static final byte[] RTD_HANDOVER_SELECT = {0x48, 0x73}; // "Hs"
public static final byte[]
RTD_ALTERNATIVE_CARRIER = {0x61, 0x63}; // "ac"

 

実際にやってみると、そうなった。
だけれども、getParcelableArrayExtra()で取ってきてやると、ちゃんとNdefMessageになった(追記参照)。
ほほぅ。

 

ってことは、NDEFが113~127byteでごにょごにょ悩んでいたが、単にNDEFというintentが飛んでこないというだけで、解析する分にはどっちでもよいということなのか。

勉強になりましたわ。


追記(2013/01/14)

やっぱりだめだ・・・。

「getParcelableArrayExtra()で取ってきてやると、ちゃんとNdefMessageになった」と書いていたが、やっぱりだめっぽい。
nullになっていたのだ。

つまり、TECH_DISCOVEREDだったとしてもgetParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)がnullにならないようにするには、AndroidがNDEFとわかった上でTECH_DISCOVEREDを返す場合だけ、ということになりそうだ。

ごめーん。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。