2014年7月4日金曜日

Android L Developer PreviewのAndroid Beam関連まとめ


NFC関連でまとめようと思ったんだけど、WiFi HandoverとHCEは少し時間がかかりそうだったのでBeam関連だけ


新機能

共有にAndroid Beamが追加


共有にAndroid Beamが追加されました。これによりアプリ側ではAndroid Beam用の実装を行わなくてもAAR以外のAndroid Beamを送ることができるようになりました。
また、従来のAndroid Beamとは若干挙動が異なります。

従来のAndroid Beam
  1. 端末を重ねる
  2. 「タップしてビーム」の宇宙画面が表示される
  3. 画面をタップ
  4. ビーム送信

共有のAndroid Beam
  1. 共有メニューをタップ(アプリによっては違う操作かも)
  2. アプリメーション選択画面からAndroid Beamを選択
  3. 「完了するには別の端末をタップしてください」の宇宙画面が表示される
  4. 端末を重ねる
  5. ビーム送信

共有のAndroid Beamは端末を重ねる前に宇宙画面が表示され、端末を重ねることでユーザの画面タップを待たずにAndroid Beamを送信できます。従来のAndroid Beamでは端末を重ねた後、ユーザの操作を待ってからAndroid Beamを送信します。
従来のAndroid Beamが端末を重ねた瞬間にAndroid Beamを送信しないのはどちらの端末がBeam送りたがっているのか端末側は判断できない、あるいはBeamの送信にユーザの同意が必要だからだと思いますが、共有のAndroid Beamはユーザが画面操作して宇宙画面に遷移しているので、ユーザがBeamを送りたがっており、かつ同意していると判断でき、最後の画面タップを省略できるのでしょう。Beamの起動に一手間かけた分最後にタップ手順が省略されてユーザの負担はあまり増えていないように思えます。
この共有のAndroid Beamの登場で、Android Beamのことを何も考えていないアプリは、端末を重ねてからAndroid Beamした場合はAARでアプリのインストールを促すことができ、共有からAndroid Beamした場合は暗黙的Intentから共有したいコンテンツをAndroid Beamできるので、AARも送りたいしコンテンツも送りたい僕なんかにはとても使いやすそうです。無駄にPermissionを取らなくてもいいしもうAndroid Beam向けの実装は要らないんじゃねーのとすら思えます。

これに関連してかNFCサービスのアイコンが変更になっています。以前はBluetooth Handoverを意識してかどう見てもBluetoothのアイコンになっていましたが、今はなんとなくNFCやWiFiを連想させるアイコンになっています。
以前はどう見てもBluetooth

なんとなくNFCやWiFiっぽい

それにしても「完了するには別の端末をタップしてください」という文言はタップを画面タップと間違えてしまいそうでわかりにくいですね。NFCでタグを読み込むことを英語ではタップと言うのでしょうか。

新API

API Overviewにざっくり載っています。
https://developer.android.com/preview/api-overview.html#Wireless
Android Beam関連だと上記の共有のAndroid Beamを実現するためのAPIが2つ追加になっています。

android.nfc.NfcAdapter#invokeBeam(Activity)

上記の「共有にAndroid Beam」で利用されているであろうAPIです。アプリからBeam用の画面を立ち上げることができ、かつその画面が立ち上がっている間は相手の端末を検知した後、画面タップせずにBeamを送ることができます。
Android Beamは「アプリがAndroid Beamに対応しているのか実際にBeamしてその結果を見ないとわからない」という状況になっており、ユーザは利用しにくかったんじゃないかと思います。そもそもAndroid Beamに対応していてもあんまり使わないのに、対応しているのかどうかわからないのでは使おうと思うユーザも少なかったのではないでしょうか。このAPIを利用すれば「ビームで送る」ボタンを作れるのでユーザにAndroid Beamに対応しているよと意思表示できます。まあ、共有のAndroid Beamで済むならソッチのほうが良さそうですが。

android.nfc.NdefRecord#createTextRecord(String, String)

文字だけのNDEF Recordを作るためのAPIです。なんで今さらという感じですが、これは共有のAndroid Beamで使ったので追加されただけのようです。実際に文字列を共有のAndroid Beamに渡すとこのAPIで作ったNDEFが送信されます。言い換えるとAPIが用意されていないNDEF Recordは共有のAndroid Beamでは送ることはできないと予想できます。例えばSmart PosterはAPIが用意されていないので、TitleとURIを共有のAndroid Beamに渡してもURIのNDEF Recordを作ります。Smart Posterは必須項目とか任意項目とかめんどくさいからね。自動判断しにくそうだもんね。

動画

NFCについて色々なことが書かれていてとっても便利なNFC Hacksという書籍の、「HACK#37 Android Beamを送受信するアプリを作る」で解説しているサンプルアプリにNfcAdapter#invokeBeamを利用するボタンを追加して動画を撮ってみました。なんとなく動画撮りたくなりますね。
video

その他

Android BeamをOffにした状態でinvokeBeamと共有のAndroid Beamを利用してみましたが普通に使えました。「端末重ねた時に勝手に宇宙の画面出るのやだ!」という人用の機能だったのかな?
NFCをOffにした状態ではinvokeBeamは使えず、共有のAndroid Beamは宇宙の画面になりましたが結局送信できませんでした。同じAPIを使っていると思ったのですが挙動が違うのでなにか違うのかもしれません。この共有のAndroid Beamの挙動は不自然なのでリリース版ではなにか変わるかもしれませんね。