AcroRabbit

今日皆を一番の笑顔にするブログ

AndroidでNFC対応アプリを作ってて大変だったこと

 さてさて秋ですね。そう、NFCの季節です。

ってわけで今回はNFCアプリ開発をしていて困ったことなどを書いていきます。(前回Wearの記事を書くって言ってた気がするのは気のせいです次からかくもん)

 

1. NFCとは

 NFCとはNear field communicationの略で、日本語だと近距離無線通信の事です。なんかSuicaとか学生証とかに入ってるやつです。大体5㎝くらいから取れるらしいです。近くに他のタグや磁石がくっつく金属板などがあると取れないことがあるので注意が必要です。Wikipediaの記事はここらへん

 

f:id:shunXnegi:20141109021349j:plain

↑こんなん

 

2. Androidアプリを作る

 Androidアプリ開発の仕方は@ITさんのAndroidアプリでNFCタグを読み書きするための基礎知識にわかりやすくまとめられているのでそちらを参考に。簡単にまとめると、Manifestに機能の使用宣言とパーミッションを追加し、特定のタグを見つけたときにインテントを飛ばしますよって感じに書きます。

 

3. タグが読めないとき色々

 ここからが本番ですのん。センサ使うアプリは周りの環境や機種依存とかで、昨日は動いたのに!とかぼくの端末ではうごくのに!みたいなことがよくありますよね。

・ついさっきまで動いてたもんって人

 タグの裏などに、磁石がくっつくタイプの金属とか、他のNFCタグがあったりすると読み込めないです。掲示板や机なども注意ですよ!

・なんか他のアプリに取られちゃうって人

 よくあるのがKDDI端末とかにプリインストールされているNFCタグリーダーですね。NFCを読み込んだときのインテント先には優先度があります。まずフォアグラウンドディスパッチシステムが動いていればそれを。次にタグにAARの記載があるか確認し、ある場合はそのアプリを起動。次にNDEF_DISCOVEREDのフィルタがあるアプリを。次にTECH_DISCOVEREDを…という順番で見ていきます。前述のNFCタグリーダーはNDEF_DISCOVEREDで動いているので、TECH_DISCOVEREDやTAG_DISCOVEREDしか指定のないアプリはインテントを全部持っていかれてしまいます。なので、アプリにNDEF_DISCOVEREDの記載は極力行うようにしましょう。優先度が同じであれば、どのアプリ起動するの?って聞かれます。

 NDEFとはタグに記載されている情報の種類みたいなやつです。text/plainとかimage/jpegとかです。NFCアプリを開発する場合、タグ情報の読み書きはせず、タグのid情報しか使わない場合もあると思います。そんなときはなんでもいいのでtext/plainとかに"にっこにっこにー♥"とかでも書いとけばいいんじゃないでしょうか。

 どのアプリ起動するの?って言う選択しさえ出さなくする方法もあります。前述のフォアグラウンドディスパッチシステムを使用します。長いので次からFDSって言いますねかっこいいし。FDSの実装方法はANDROID MEMO WIKIさんで分かりやすく紹介されています。FDSを使うと、今表で動いているアプリが最優先でインテントを取りに行くので、アプリ実行中は確実にタグを読むことが出来ます。

 もしくはAAR(Android Application Record)を使う方法もあります。AARはAPIレベル14(Android4.0)で導入された機能で、NFCタグのNDEF情報の中に、そのタグを読みこんだときに優先的にインテントを飛ばすアプリのパッケージ名を記載することが出来るものです。記載されたアプリがインストールされていない場合はplayストアの該当ページを開きます。タグに書きこむレコードを作成するときに

NdefRecord.createApplicationRecord("com.example.negichan")

みたいな感じで書けばOKです。

・そもそも何のアプリも起動しないんだけどって人

 僕はこれに一番悩まされました。自分の端末では動くけど人の端末でやろうとするとなんか知らんけど動かないんだけどってなります。大丈夫だとは思いますがまず端末のNFCがオンになっているかどうかを調べましょう。アプリケーション内からNFCのオンオフを切り替えることは出来ませんが、現在NFCがオンになっているかどうかはわかるので、オフの場合は設定画面に飛ばしてあげるようにするといいと思います。

 そして僕が一番悩まされたのは、NFCタグは種類によっては対応していないAndroid端末があるということです。まぁ主にNfcVという規格なのですが、こいつは国産の端末だと対応してなかったりします。ねぎちゃんのはいつもグローバルモデル感あふれるNexus5で開発していたので、なんでみんな取れないんだぁって思ってました。

4. まとめ

 今回は、学祭向けのNFCスタンプラリーシステムを作ってる時に、いろいろ困ってた事を書きました。NFCは未来感あふれてカッコイイですが、使える場所が制限されていたり、iOSではまだ対応端末を持っている人が多くないという問題点もあります。これからもっとNFCを使ったカッコイイサービスが増えるといいですね。次回こそはちゃんとAndroidWearの記事を書きますよ!ばいのん。