Android 4.xのAndroidビームをアプリに組み込むには:Androidで動く携帯Javaアプリ作成入門(39)(3/3 ページ)
NFC/BluetoothによるAndroid端末同士の通信、通称「Androidビーム」について、4.0と4.1の違いも含めサンプルを使って解説します
Android 4.0のAndroidビームの実装
Android 4.0のAndroidビームは、CreateNdefMessageCallbackを実装して送信します。
@Override public NdefMessage createNdefMessage(NfcEvent event) { Log.d(TAG, "createNdefMessage"); NdefMessage msg = null; int checkedId = mRadioGroup.getCheckedRadioButtonId(); if (checkedId == R.id.radio0) { Time time = new Time(); time.setToNow(); String text = ("Beam me up!\n\n" + "Beam Time: " + time.format("%H:%M:%S")); msg = new NdefMessage(NdefRecord.createMime( "application/com.example.android.beam", text.getBytes()) //,NdefRecord.createApplicationRecord("com.example.android.beam") ); } else if (checkedId == R.id.radio1) { msg = new NdefMessage( NdefRecord.createUri("http://www.atmarkit.co.jp/")); } return msg; }
どのラジオボタンが選択されているかで、送信するメッセージの生成を作り分けています。何も送信しない場合は、このメソッドはnullを返します。
ラジオボタンで「Text message」が選択されている際に送信するメッセージ生成で、コメントアウトされている行があります。NdefMessageのコンストラクタは、1つ以上のNdefRecordを引数に取ります。
11〜13行目では、「Android Application Record」(以下、AAR)をコンストラクタに渡すのを省略しています。AARを省略する場合、前述したAndroidManifest.xmlにIntentFilterが必要で、AARを渡す場合、指定したアプリケーションにのみメッセージが送信されるため、IntentFilterが必要なくなります。
URLを送信する場合、Webブラウザやそれに準じるアプリが起動されることを期待して、AARは付与しない方がユーザーは使いやすいでしょう。
Android 4.1のAndroidビームの実装
Android 4.1のAndroidビームは、CreateBeamUrisCallbackを実装して送信します。
@Override public Uri[] createBeamUris(NfcEvent event) { Log.d(TAG, "createBeamUris"); Uri[] uri = null; if (mRadioGroup.getCheckedRadioButtonId() == R.id.radio2) { uri = new Uri[] { Uri.fromFile(mPng) }; } return uri; }
ラジオボタンで「PNG file」が選択されている場合にのみ、Uriのリストを返します。複数のコンテンツを一気に送る場合に便利なインターフェイスになっています。送信するものがない場合、nullを返します。
OnNdefPushCompleteCallbackの実装
メッセージ送信が完了したことを通知するコールバックを実装します。
@Override public void onNdefPushComplete(NfcEvent arg0) { Log.d(TAG, "onNdefPushComplete"); mHandler.obtainMessage(MESSAGE_SENT).sendToTarget(); }
上記実装は、Handler経由でToastを表示しています。このコールバックが呼び出されたら、端末を離しても大丈夫です。Android 4.1のAndroidビームの場合、Bluetooth通信が開始しています。
2つのAndroidビームの使い分け
今回のサンプルでは、ラジオボタンでどのようなデータを送信するかを選択し、データによって2つのAndroidビームのどちらを使用するかを決めています。
@Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.radio0 || checkedId == R.id.radio1) { mNfcAdapter.setBeamPushUrisCallback(null, this); mNfcAdapter.setNdefPushMessageCallback(this, this); } else { mNfcAdapter.setNdefPushMessageCallback(null, this); mNfcAdapter.setBeamPushUrisCallback(this, this); } }
上記はRadioGroupのリスナの定義です。
テキストメッセージとURLアドレスの場合は、NfcAdapter#setNdefPushMessageCallback()を有効にし、NfcAdapter#setBeamPushMessageCallback()を無効にしています。
PNGファイルの場合はその逆で、NfcAdapter#setBeamPushMessageCallback()を有効にし、NfcAdapter#setNdefPushMessageCallback()を無効にしています。このようにすることで、2つのAndroidビームを排他的に使用しつつ共存させることが可能です。
どのようなデータをどちらのAndroidビームで送信するかの判断材料の大きな要素は、送信するデータのサイズです。「テキストメッセージだから、Android 4.0のAndroidビームで送る」という判断ではなく、テキストメッセージのサイズで判断した方が賢明です。NFCの通信は最大424kbpsですが、体感では想像以上に遅いです。
コラム Android 2.3.3(API Level 10)から存在するNDEFプッシュ
NFCはAndroid 2.3(API Level 9)から利用可能で、Android 2.3.3(API Level 10)からフォアグラウンドNDEFメッセージプッシュが利用可能です。
これはAndroidビームと似た仕組みなのですが、Androidビームと異なりOSレベルでNDEFメッセージをハンドリングせず、アプリが協調してメッセージの取得優先順位を制御しなければならず、実際には協調することはできないため、使い勝手があまり良くない仕組みでした。
Androidビームは、このNDEFプッシュを置き換える新しい仕組みで、現在ではNDEFプッシュは非推奨になっています。ただし、古い機種との互換性を維持するために使うことは可能です。詳細は、NfcAdapter#enableForegroundNdefPush()とNfcAdapter#disableForegroundNdefPush()を参照してください。
Androidビームの魅力と弊害
Androidビームの魅力は、複雑な手続きなしで相手にデータを送信可能な点です。端末の背面を合わせることで「タッチしてビーム」という画面が表示され、その画面ではタッチ以外の操作ができないのもシンプルさの表れです。
シンプルさを追究しているAndroidビームですが、シンプルさ故の弊害もあります。背中合わせにした端末がどちらもアプリを起動していた場合、先にタッチしてビームした方のデータが送信されます。1度で双方向にデータを送り合うことはできないので、名刺交換のようなユースケースでは、再度背中合わせにして、もう一方から送信しなければなりません。
筆者は「Samsung Galaxy Nexus」「ASUS Nexus 7」で本記事の検証を行ったのですが、この際困ったのは、NFCが背面のどこにあるのか分からず、なかなかAndroidビームが起動しないことでした。どちらの端末にも背面にNFCの位置が刻印されていないためです。
特に、Nexus 7は大きいので、1cmずつずらして位置を探さなければならず、しかも早く動かし過ぎると通信に失敗するため、せっかくのシンプルな仕組みが刻印がないことで台無しになってしまっています。
国内のメーカーは、「おさいふケータイ」の経験があるので、実装されていればFeliCaのマークは付いていることがほとんどだと思います。
ただ、国内に限ってFaliCaはあってもNFCがない端末が多く見受けられます。Androidビームで目の前の友人とURLを共有しようとして、NFCの位置を探し回った挙句、実は友人の端末はNFCをサポートしていないことが分かった、というシチュエーションは残念過ぎます。メーカーには、背面にNFCの位置を示す刻印を付けるように努力してほしいところです。
従来のフィーチャーフォンの赤外線通信によるデータ交換のような普及はもう少しかかりそうだと感じました。
- グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方
- 細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめ
- 腕時計から電話をかけるAndroid Wearアプリの作り方
- Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方
- Android 5.0発表&スマホと連動する音声認識Android Wearアプリの作り方
- ウェアラブル端末用Android Wearアプリ開発の基礎知識
- 変わらないと生き残れないAndroid Lの新機能まとめ
- Android WearやIoTで注目のAndroidセンサー機能8選
- ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ
- あなたの知らないAndroid SDKの便利tools、14選まとめ
- Android 4.4のメモリ使用状況を把握する3つのツールの使い方
- Androidでリアルタイムマルチプレーゲームを開発するには
- 低性能端末でも使えるか? Android 4.4 KitKatの新機能39選
- もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能
- アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識
- あなたのアプリはクラウドにデータをバックアップできますか?
- Eclipse ADTに代わるIDEとなるか? Android Studioの基礎知識
- ActionBarで、アプリのUIはこんなにスマートになる
- Android 4.x時代のアプリにないと残念なActionBarとは
- 動的クラスローディングでAndroidアプリ“裏”開発
- Android 4.xのAndroidビームをアプリに組み込むには
- AndroidアプリでNFCタグを読み書きするための基礎知識
- 新タブレット時代を見据えるAndroid 4.2の新機能9選
- Androidからイヤフォンやヘルス機器とBluetooth通信するには
- Bluetoothを使ってAndroidアプリ同士で通信するには
- Androidアプリをアプリ内購読に対応してもうける方法
- 開発者が知らないと残念過ぎるAndroid 4.1の新機能36選
- Androidのプロセス間通信を自由自在にするAIDL
- Android 4.0のサービス/プロセス間通信の基本
- Androidアプリでマルチメディアを扱うための基礎知識
- Androidのウィジェットにノーティフィケーションするには
- Android 4.0で注目の顔認識をアプリに組み込むには
- Android 4.0でアプリ開発を始めるための環境構築
- 開発者が知らないと損するAndroid 4.0の新機能44選
- Android Compatibility packageで2.x系でもマルチサイズ対応
- Androidの画面の大きさの違いを解決するFragments
- Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 開発者が知って得するAndroid 2.3の新機能18選
- アニメーションでAndroidに独創的な画面エフェクトを
- Androidアプリで“アニメーション”するための基礎知識
- XMLレイアウトでAndroidアプリに“設定画面”を追加
- 開発者が知っておきたいAndroid 2.2の新機能12連発
- もはやケータイに必須のカメラをAndroidで制御しよう
- 地図/位置情報/GPSを使うAndroidアプリを作るには
- Android NDKでJNIを使用してアプリを高速化するには
- Android 2.1の新機能「Live Wallpaper」で作る、美しく燃える“待ち受け”
- iPhoneより多彩なAndroidのセンサをアプリで操作
- SurfaceViewならAndroidで高速描画ゲームが作れる
- Android 1.6のジェスチャーとテキスト読み上げを使う
- Androidのホーム画面に常駐するアプリを作るには
- Netbookにも広まるAndroidで、かつてないWeb体験を
- アプリを国際化してAndroid Marketから世界へ発信
- 常駐アプリが作成できるAndroidの“サービス”とは
- AndroidでSQLiteのDB操作をするための基礎知識
- Androidアプリの使いやすさを左右する5つのレイアウト
- 簡単でワクワクするAndroidウィジェット10連発!
- ブラウザや地図、ストリートビューの基、Intentとは?
- Androidアプリ作成の基本“Activity”とは何か?
- Android Market配布を目指しEclipseでHelloWorld!
関連記事
- スマホアプリの作り方【超まとめ】通信・ネットワーク編:アプリをクラウドやソーシャルにつなぐための記事48選>近距離無線技術
- スマホ技術者も知らないと損する「O2O」の基礎知識
O2Oを4つのパターンで整理し、今注目される理由や事例、パーソナル情報との関連性、O2OクライアントとしてAndroidアプリを作成する際に必要な技術などを徹底解説します
Copyright © ITmedia, Inc. All Rights Reserved.