Lenovo Phab 2 Pro で Project Tango 入門 2

前回に続き、サンプルの動作を確認していきましょう。
java_augmented_reality_exampleです。
これは、Tango APIを使用して拡張現実感(AR)アプリケーションを作成する方法を示す簡単な例です。 それは、装置の正面1メートルのところに浮かぶ惑星地球とその周りを回転する月を表示します。
この例では、OpenGLレンダリングにRajawaliを使用しています。これには、バックグラウンドでの カラーカメラ画像と、前方3mの空間に浮かぶ地球の質感を持つ3D球が含まれます。
この部分は、通常のRajawaliアプリケーションのように、{@code AugmentedRealityRenderer} クラスで実装されています。
この例では、Tango APIを使用してOpenGLテクスチャにカラーカメラデータを効率的に取得し、 拡張現実感効果を実現するためにOpenGLカメラがデバイスの動きを追跡するようにする方法に焦点を当てます。
Rajawaliの仮想世界をRGBカメラと同期させる最良の結果を得るには、 KEY_BOOLEAN_LOWLATENCYIMUINTEGRATION設定パラメータを含めることが重要です。
Rajawaliのようなレンダリングライブラリを使用しない、より抜粋した例を探しているなら、 java_hello_video_exampleを見てください。
では、import projectをクリックし、java_augmented_reality_exampleを選択してOKを押します。

RajawaliはAndroid OpenGL フレームワークです。
実行すると次のように地球と月が表示され、位置がほぼ固定されます。ただ追従はあまりよくない感じです。

 

Lenovo Phab 2 Pro で Project Tango 入門

世界初の Tango 対応スマートフォンLenovo Phab 2 Proを購入しました。

まずは開封の儀

IMG_3839
なんとパッケージから内部が見えます。Phab 2 Proの特徴であるデプスカメラ、モーション・トラッキング・カメラが見えています。
 
IMG_3840IMG_3841
かなりでかい印象です。Xperia Zと比べるとこんなにも違います。
付属品は、ACアダプタ、ヘッドフォン、USBケーブル。
早速電源に繋いで充電をします。充電されるのを待っている間に、Project Tangoについて勉強することにしましょう。
まずは、Googleのサイトから。
https://get.google.com/tango/
まずはProject Tangoの仕組みの概要です。
Tangoのコンセプト
モーショントラッキング
エリア学習
奥行き検知

サンプルプロジェクトのダウンロードと実行

https://github.com/googlesamples/tango-examples-java/archive/master.zip をダウンロードします。
Android Studioを起動して「Inport project」より、java_basic_examplesディレクトリを選択してOKを押します。

プロジェクトが開いたら、ツールバーを見るといくつかのモジュールが存在していると思います。ここからhello_motion_trackingを選択してRunボタンをおして実行してみましょう。

実行するとAndroid Studioの下部に生の姿勢データが表示されます。

では次にhello_depth_preceptionを実行してみましょう。これも同じくLogcatに生の値を吐くだけです。ただポイントクラウドはデータ量が多いからか距離の平均を出力しているようです。

Logcatを見るかぎり、おおよそ0.2秒間隔で3万6千個の点を取得出来ているようです。
次に、heloo_area_descriptinを実行してみましょう。このサンプルは先ほどまでのサンプルより複雑ですね。
Larning mode onにしてStartするとセンサーの値から領域を学習し、学習した領域をADFに保存します。
最後にhello_videoです。
このhello_videoはとてもなめらかに動き、ほぼ遅延なくRGBカメラからの画像が画面上に表示されます。
ヘッダよりこのサンプルは以下の機能を説明しています。

 このサンプルでは、RGBカメラをOpenGLテクスチャに変換します。
 単純なレンダラーで標準のAndroidのサーフェスビュー(GLSurfaceView)を作成し、ビデオレンダリング用の適切な設定でTangoサービスに接続します。
新しいRGBビデオフレームがTango APIを介して利用可能になるたびに、OpenGLテクスチャに更新され、対応するタイムスタンプがlogcatおよびスクリーンに印刷されます。
 
 Tango RGBカメラで生成された特定のテクスチャ形式をレンダリングする方法を理解するために必要な最小OpenGLコードのみが提供されています。
これらの詳細は、HelloVideoRendererで見つけることができます。
 拡張現実エフェクトを使用して実際の3Dオブジェクトをレンダリングする例をお探しの場合は、java_augmented_reality_example
および/またはjava_augmented_reality_opengl_exampleを参照してください。

 

カスタムレイアウトの作成

一覧に戻る
スクリーンサイズと一見性を考慮したデザインという点を除けば、ウェアラブル端末用のレイアウト作成は携帯デバイスと同じです。良いユーザー体験は除きますが、携帯アプリの機能やUIを持ち込むべきではありません。必要な場合のみカスタムレイアウトを作成すべきです。良いウェアラブルアプリのデザイン方法についてはデザインガイドラインを読んでください。

カスタムNotificationを作成する

一般的には、携帯デバイスで通知を作成しそれを自動的にウェアラブル端末に同期するようにします。ひとたび通知を構築すれば、それぞれ異なるフォームファクターのためにデザインを行わなくても、多くの種類のデバイス(ウェアラブル端末だけではくやがてはAutoやTV)に表示されます。
スタンダードな(NotificationCompat.BigTextStyleやNotificationCompat.InboxStyleといった)通知スタイルでは目的に合わない場合、カスタムしたレイアウトのアクティビティを表示することができます。単にカスタム通知を生成しそれをウェアラブル端末に発行します。システムはそれらの通知を携帯端末には同期しません。
注意:ウェアラブルのカスタム通知を生成する場合、サポート・ライブラリの代わりに標準の通知API(API Level20)を使用する事ができます。
カスタム通知を作成するには:
1. レイアウトを作成し表示したいアクティビティのコンテンツビューにセットします。
[java]public void onCreate(Bundle bundle){

setContentView(R.layout.notification_activity);
}[/java]
2.  ウェアラブル端末のコンテキストストリームプロセスにアクティビティの表示を許可するようにアクティビティに必要なプロパティをAndroidマニフェストに定義します。アクテビティをエクスポートを可能に、組み込みを可能に、タスク一体性を空白として定義する必要があります。またテーマをTheme.DeviceDefault.Lightに設定することをおすすめします。例えば次のようにします。
[xml]<activity android:name=”com.example.MyDisplayActivity”
android:exported=”true”
android:allowEmbedded=”true”
android:taskAffinity=””
android:theme=”@android:style/Theme.DeviceDefault.Light” />[/xml]
3. 表示したいアクテビティ用にペンディングインテントを作成します。例えば次のようにします。
[java]Intent notificationIntent = new Intent(this, NotificationActivity.class);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);[/java]
4. 通知を作成しPendingIntentのsetDisplayIntent()を呼び出します。システムは、このペンディングインテントをユーザが通知を見る時にアクテビティを起動するために使用します。
5. notify()メソッドで通知を発行します。
注意:通知がホームスクリーン上に覗いている時、システムは通知のセマンティックデータから生成し、通常のテンプレートを使用して通知を表示します。このテンプレートは全ウォッチフェイスに適しています。ユーザが通知を上にスワイプした時に通知のカスタムアクティビティが表示されます。

ウェアラブルUIライブラリでレイアウトを作る

Android Studioプロジェクトウィザードでウェアラブルアプリを作った時に自動的にインクルードされる非公式なUIライブラリです。build.gradeファイルに次のように依存関係を宣言してライブラリを追加することもできます。
[text]dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘com.google.android.support:wearable:+’
compile ‘com.google.android.gms:play-services-wearable:+’
}[/text]
これらのライブラリはウェアラブルのために設計されたUIを構築することができます。これらは主要なクラスの一部です。

  • BoxInsetLayout – スクリーン形状を認識して丸型ディスプレイの中央に四角形の子レイアウトとしてボックス化するFrameLayout
  • CardFragment – 拡張範囲内のコンテンツを提示する垂直にスクロール可能なカードのフラグメント
  • CircledImageView – 丸で囲まれた画像
  • ConfirmationActivity – ユーザーがアクションした後に確認のアニメーションを表示するActivity
  • DismissOverlayView -長押しで非表示になるビュー
  • GridViewPager – 水平と垂直にページデータを移動するためのレイアウトマネージャ。ビューが示すページを生成するためにGridPagerAdapterを提供する必要がある
  • GridPagerAdapter – GridViewPagerにページを提供するアダプター
  • FragmentGridPagerAdapter – 各ページをフラグメントにしたGridPagerAdapterの実装。
  • WatchViewStub – デバイスの画面形状に応じて特定のレイアウトをインフレート出来るクラス
  • WearableListView – 小さなウェアラブルデバイスで使いやすいように最適化されたListViewの別バージョン。垂直スクロールのリストを表示し、スクロールを停止した時に自動的に一番近い項目で止まる

上記クラスの完全なAPIリファレンスドキュメントをダウンロードして下さい。このドキュメントはそれぞれのUIウィジェットの使用方法が記載されています。
次:音声機能を追加する>
 

Android Wearエミュレータと実機をUSBデバッグ接続する

ちょっとわかりずらかったのでメモ。
まず、Wearのエミュレータを起動後、Android端末をUSB接続。
adbコマンドを実行
adb -d forward tcp:5601 tcp:5601
Google Playからダウンロード・インストールしたAndroid Wearを起動する。
すでに実機(Gear Live)と接続済みの場合、以下の様な画面になる。
Screenshot_2014-07-16-22-02-20
 
エミュレータと接続するため、「新しいウェアラブルとペア設定」をタップ。
Screenshot_2014-07-16-22-02-27
 
歯車をタップして「エミュレータをペア設定」
Screenshot_2014-07-16-22-02-35
 
以上で、エミュレータと接続完了します。接続すると以下の様な画面になります。
Screenshot_2014-07-16-22-03-09
 
 
 

ウェアラブルアプリケーションの作成と実行

一覧に戻る

Samsun Galaxy Gear Live届きました!

IMG_0428
 
一週間使ってみました。小さなデバイスですし、表示される内容も多くはありません。正直あまり期待してはいなかったのですが、以外にも便利だということがわかりました。まず、重要なメールが着信した時だけ、バイブと共に通知が表示されます。ちらっと腕を見れば誰から来たメールの内容もすぐにわかって、意外に便利です。あと、以外にも歩数計がお気に入りです。初期設定では1万歩が目標に設定されています。歩数がいつでも手元に表示されるので、エスカレータと階段があれば、ついつい階段で歩数を稼ぎたくなっちゃいます。1万歩を達成すると、「目標の歩数に到達しました」とちょっとお祝いしてくれます。心拍数計も今のところ楽しく使っています。正確性はイマイチですが、健康管理としては十分だと思います。普段は60〜70ぐらいで、まあ男性の平均値ぐらいですが、今日わかったのは、人前でスピーチする前は心拍数が100回ぐらいまで上がって、緊張しまくっている自分を再認識。なるほど、緊張すると心拍数はこれくらいまであがるのね、と認識しました。充電は1日しか持たないのが唯一の欠点ですが、スマートフォンを充電台に置くときに同時に充電するようにしているので、そんなに苦には感じません。音声認識は便利ですが、駅のホームや電車の中では当然恥ずかしくて使えないので残念です。雑踏を歩きながら思いついたフレーズや買い物リストをちょっとメモするのにはかなり便利だったりします。入力した内容はGoogle Keepに登録するように設定していますので、あとからスマホやPCで確認できるのもいいですね。
Android Wear、かなり気に入っちゃっています。はやくオリジナルアプリを作りたい!というわけで、今日も翻訳しながら理解を進めていきたいと思います。
 

ウェアラブルアプリケーションの作成と実行

ウェアラブルアプリはウェアラブルデバイス上で直接実行され、ウェアラブル特有であるセンサ、アクティビティ、サービスその他の低レベルハードウェアへアクセスすることができます。
Google Play ストアに公開するなら、ウェアラブルアプリを含んだセットとなる携帯用アプリも必要です。ウェアラブルはGoogle Play ストアに対応していないので、ユーザーがセットとなる携帯アプリをダウンロードすると、自動的にウェアラブルにウェアララブル用アプリが送信されます。携帯向けアプリは重い処理、ネットワーク処理、その他の作業を行ってウェアラブルに結果を送信するのに便利です。
このレッスンでは、デバイスまたはエミュレータを設定し、ウェアラブルと、携帯アプリを含むプロジェクトを作成する方法を身につけます。

Android Wear エミュレータまたはデバイスを設定する

より良いユーザ体験を判断するためには実際のハードウエアで開発することをおすすめします。しかしエミュレータも異なるタイプのスクリーン形状をテストするのに役立ちます。
Android Studio バージョン0.8以降と、Gradle バージョン0.12以降が必要です。
java6以上が必要です。ここからjava7JDKをインストールして(java8は敬遠)、Android Studioをダウンロード、インストールします。

Android Wear仮想デバイスを設定する

Android Wear仮想デバイスの設定方法

  1. Tools > Android > AVD Managerをクリック。
  2. Create…をクリック。
  3. AVDを設定します。その他はデフォルト値のままにしておきます。
    1. AVD NAME – AVD名です
    2. Device – Android Wear の丸型か四角型かを指定します。
    3. Target – Android 4.4W – API Level20
    4. CPU/ABI – Android Wear ARM(armeabi-v7a)
    5. Keybord – Hardware keyboard presentを選択
    6. Skin – Deviceで選んた形状にあわせ、AndroidWearRoundもしくはAndroidWearSquareを選択します。
    7. Snapshot – 選択しません。
    8. Use Host GPU – ウェアラブルの通知でカスタムアクティビティをサポートするためには選択します。
  4. OKをクリック。
  5. エミュレータを起動します。
    1. 作成した仮想デバイスを選択します。
    2. Start…をクリックしてLaunchをクリックします。
    3. エミュレータが初期化されAndroid Wearのホーム画面が表示されるまで待ちます。
  6. 携帯とエミュレータをペアリングします。
    1. 携帯にて、Google Playから「Android Wear」アプリをインストールします。
    2. 携帯とパソコンをUSB接続します。
    3. AVDの接続ポートを接続された携帯デバイスへ向けます。(携帯を接続するたびに行う必要があります)
      adb -d forward tcp:5601 tcp:5601
    4. 携帯でAndroid Wearアプリを起動し、エミュレータに接続します。
    5. Android Wearアプリの右上隅のメニューから「Demo Card」をタップします。
    6. カードを選択するとエミュレータ上のホームスクリーンに通知として表示されます。

Android Wearデバイスの設定

Android Wearデバイスの設定方法

  1. Google Playから提供されるAndroid Wearアプリを携帯にインストールします。
  2. アプリケーションの説明に従い携帯とウェアラブルをペアリングします。これが出来れば、同期した携帯の通知をテストすることが出来ます。
  3. 携帯でAndroid Wearアプリを開いたままにしておききます。
  4. USB経由でパソコンにウェアラブルを接続するため、開発したアプリを直接インストールできます。ウェアラブルとAndoroid Wearaの両方にデバッグ許可の問合せメッセージが表示されます。
  5. Android Wearアプリでは、Always arrow from this computerにチェックを入れ、OKを押します。

Android StudioのAndroid toolウィンドウにウェアラブル端末のシステムログが表示されます。adb devicesコマンを実行した時にウェアラブル端末が表示されるはずです。

プロジェクトの作成

開発を始めるには、ウェアラブルと携帯のアプリケーションモジュールを含んだプロジェクトを作成します。Android Studioで、File>New Projectをクリックし、プロジェクトウィザードの指示に従いプロジェクトを作成します。ウィザードに従い、次の情報を入力します。

  1. Configure your Projectウィンドウで、アプリケーションメイトパッケージ名を入力します。
  2. Form Factorsウィンドウで
    1. Phone and Tabletを選択し、Minimum SDKをAPI8:Android2.2(Froyo)以降に設定します。
    2. Wearを選択し、Minimum SDKをAPI20:Android4.4(KitKat Wear)以降に設定します。
  3. 最初のAdd an Activityウィンドウで携帯端末用の空のActivityを追加します。
  4. 2つ目のAdd an Activityウィンドウで、Wear用の空のActivityを追加します。

ウィザードが完了するとAndroid Studioはプロジェクトに「mobile」と「wear」の2つのモジュールを作成します。これでアクティビティ、サービス、カスタムレイアウトなどを作成するための携帯用とWear用の両方を含むプロジェクトが出来ました。携帯用アプリでは、ネットワーク通信や重い処理や多くのユーザーとのやり取りが必要なタスクを行います。通常それらが完了したなら、ウェアラブル端末に対してノーティフィケーションまたはウェアラブル端末との同期及びデータ送信で通知します。
注意:Wearモジュールには、デバイスのスクリーンが丸型か四角形かによりレイアウトを生成するWatchViewStubを使ったHello Worldアクティビティも含んでいます。WatchViewStubクラスはwearable support libraryで提供されるUI widgetクラスの1つです。

ウェアラブルアプリをインストールする

開発時は携帯用アプリのようにアプリをウェアラブル端末にインストールすることができます。adb installコマンドまたはAndroid StudioのPlayボタンを使います。
アプリを公開する準備ができれば、携帯向けアプリにウェアラブル用アプリを組み込みます。ユーザがGooglePlayから携帯向けアプリをインストールすると、接続されたウェアラブル端末が自動的にウェアラブル用アプリを受信します。
注意:デバッグキーで認証したアプリではウェアラブル用アプリの自動インストールは機能しません。リリースキーのみで機能します。完全なウェアラブル用アプリのパッケージ方法の詳細についてはPackageing Wearable Appsを参照してください。
「Hello World」アプリケーションをウェアラブル端末にインストールするには、Run/Debug configuration ドロップダウンメニューからwearを選択し、Playボタンをクリックします。
アクティビティがウェアラブル端末に現れ、「Hello World!」と表示されます。

適切なライブラリのインクルード

プロジェクトウィザードの一部として、適切な依存関係がbuild.gradleファイルの適切なモジュールとしてインポートされます。それらの依存関係が必要なければ次の記述を読んでそれらが必要かどうか調べます。
通知(ノーティフィケーション)
Android v4 support library(もしくはv13。これにはv4が含まれています)には携帯上で既存の通知を拡張するためのAPIが含まれています。 ウェアラブルのみに表示される通知の場合には、ウェアラブル上の通常のフレームワークAPI(APL Level 20)だけを使い、プロジェクトのmobileモジュールからはサポートライブラリを削除できます。
ウェアラブルデータレイヤー
Wearable Data Layer APIでウェアラブル端末と携帯端末の間でデータを同期または送信する場合、最新バージョンのGoogle Play servicesが必要です。それらのAPIを使わない場合、両方のモジュールから依存関係を削除します。
ウェアラブルUIサポートライブラリ
これは非公式のライブラリで UI widgets designed for wearablesに含まれます。ベストプラクティスが示されているためアプリで使用することを推奨しますが、常に変更され続けます。しかしながらライブラリがアップデートされたとしても、アプリケーション内にコンパイルされているのであなたのアプリが動かなくなるということはありません。アップデートされたライブラリから新機能を使うためには、新しいバージョンに静的リンクし、それに応じてアプリケーションを更新する必要があります。このライブラリはウェアラブルアプリの作成にのみ適用できます。
次のレッスンでは、ウェアラブルのレイアウトデザイン作成だけでなく、プラットフォームでサポートされている様々な音声操作の方法についても学習していきます。
次へ:カスタムレイアウトの作成 >
 

ウェアラブルアプリの作成

一覧に戻る
Moto360も今月末には予約開始だと思われるが、もう待てません。とうとう、Gear Liveポチってしまいました。7/7出荷予定だそうですが、今現在まだ届いてません。
スクリーンショット 2014-07-07 4.50.09
配達状況を見ると「ベース通過」となっています。明日ぐらいには届くと嬉しいなぁ!

荷受       2014/7/4 ヤマト国際物流香港(東日2)	86530
出荷       2014/7/5 ヤマト国際物流香港(東日2)	86530
到着       2014/7/5 羽田小口通関支店	541720
輸入通関   2014/7/5 羽田小口通関支店	541720
国内発送   2014/7/6 国際宅急便サービスセンター	29970
国内発送   2014/7/6 国際宅急便サービスセンター	29970
作業店通過 2014/7/6 羽田クロノゲートベース	32990

さて、Gear Liveが届くまで、Android Wearのサイトを翻訳しながらWear開発について理解を深めていきたいと思います。
ウェアラブルアプリはデバイス上で直接実行され、センサーやGPUといったハードウェアにアクセス可能にします。それらは基本的に、Anroid SDKで他のデバイス向けにビルドされたアプリケーションと同じですが、デザインとユーザビリティと提供される機能の数は大きくことなります。携帯とウェアラブルアプリの主な相違点として次のようなものがあります。

  • システムにはタイムアウト期間が適用されます。アクティビティを表示したままでユーザが何も操作しない場合には、デバイスはスリープ状態になります。スリープから復帰すると、ActivityではなくWearのホームスクリーンが表示されます。もしあなたが何かを常時表示したいのなら、コンテキストストリームに通知を作成すべきです。
  • ウェアラブルアプリは携帯アプリに比べて比較的サイズが小さく機能的に少ない。ウェアラブル向けの機能だけが含まれており、通常それらは携帯アプリ向け機能のサブセット版となっています。一般的には、携帯上で操作を実行し、ウェアラブルには結果を送信するようにすべきです。
  • ユーザーはウェアラブルに直接アプリをダウンロードしなようにします。その代わりに、携帯アプリ内にウェアラブルアプリを同梱してください。システムはユーザが携帯アプリをインストールすると、自動的にウェアラブルアプリをインストールします。しかしながら、開発目的であればウェアラブルデバイスに直接アプリをインストールすることが出来ます。
  • ウェアラブルアプリは多くのAndroid標準APIにアクセス出来ますが、次のAPIはサポートされません。
    • android.webkit
    • android.print
    • android.app.backup
    • android.appwidget
    • android.hardware.usb
      APIを使用する前にhasSystemFeature()を呼べばウェアラブルがその機能をサポートするか調べることが出来ます。

注意:プロジェクトのセットアップ、ライブラリの包含、パッケージングツールなどADTでは提供されない機能を提供するので、Android Wearの開発にはAndroid Studioの使用をおすすめします。 以降このトレーニングではAndroid Studioを使うことを想定しております。
ウェアラブルアプリケーションの作成と実行
ウェアラブル用と携帯用のアプリモジュールの両方を含むAndroid Studioプロジェクトを作成する方法と、アプリをデバイス上やエミュレータ上で実行する方法を学習します。
カスタムレイアウトの作成
通知とアクティビティのカスタムレイアウトの作成と表示方法を学習します。
音声機能の追加
音声アクションでアクティビティを起動する方法と、任意の音声入力をするためにシステムの音声認識を起動する方法を学習します。
ウェアラブルアプリをパッケージ化する
携帯用アプリの中にウェアラブルアプリをパッケージ化する方法について学習します。ユーザーがGooglePlayからインストールすると、システムが自動的にウェアラブルアプリをインストールすることが出来ます。
Bluetooth経由でのデバッグ
USBの代わりにBluetooth経由でウェアラブルをデバッグする方法を学習します。

Android Wearの通知をスタックする

さて、今日は通知にページを追加する方法です。
昨日までの記事は以下になります。

Android Wearの通知をスタックする方法を学びます。ポイントは、ウェアラブルデバイスではスタックとしてグループ化し、携帯デバイス上では、要約した1つの通知にまとめる点です。
では今日もこちらを翻訳しながら読み進めていきます。

通知をスタックする

携帯デバイス向けに通知を作成するとき、類似した通知は常に要約された1つの通知に集約する必要があります。例えば、アプリが受信したメッセージの通知を作成する場合、さらに他の通知を携帯デバイスに表示すべきではありませんーこのようにさらに他の通知を受け取った場合は、「2 new messages」のように要約された1つの通知を使用します。
しかしながら、要約された通知はユーザーはウェアラブル上でそれらメッセージの詳細を読むことが出来ないので、Androidウェアラブルではあまり有用ではありません(より多くの情報を表示するには携帯でアプリを開く必要があります)。そのためウェアラブルデバイスでは、すべての通知をまとめてスタックに入れるべきです。通知のスタックは1枚のカードとして表示され、通知の詳細をそれぞれ個別に広げて見ることができます。新しいsetGroup()メソッドがこれを実現し、要約された1つの通知をハンドヘルドデバイスに提供することが可能になります。
通知のスタックに関する設計の詳細については、Design Principles of Android Wearを参照して下さい。

通知をグループに追加する

スタックを作成するにはスタックに入れたい通知に対しsetGroup()を呼び出します。例を示します。
[java]
final static String GROUP_KEY_EMAILS = “group_key_emails”;
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
.setContentTitle(“New mail from ” + sender)
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail);
Notification notif = new WearableNotifications.Builder(builder)
.setGroup(GROUP_KEY_EMAILS)
.build();
[/java]
デフォルトでは、通知は追加した順に表示され、直近の通知が一番上に表示されます。setGroup()の第2パラメータに表示順を渡すことで、グループ内での場所を明示的に定義することが出来ます。

通知の要約を追加する

それから、携帯デバイスに表示するための通知の要約を提供することも重要です。そのため一意の通知を同じスタックグループに追加することに加えて、通知の要約を追加することも重要で、それには表示順としてGROUP_ORDER_SUMMARYを設定します。
[java]
Notification summaryNotification = new WearableNotifications.Builder(builder)
.setGroup(GROUP_KEY_EMAILS, WearableNotifications.GROUP_ORDER_SUMMARY)
.build();
[/java]
この通知は、ウェアラブル上のスタックの通知の通知としては表示されず、携帯デバイス上だけの通知として表示されます。
さて、以上でAndroid Wear Developer Previewの機能にひと通り目を通しました。
次回からは、Googleから提供されているサンプルアプリケーションを解析してみたいと思います。

Android Wearの通知にページを追加する

さて、今日は通知にページを追加する方法です。
昨日までの記事は以下になります。

それではこちらを翻訳しながら理解を深めていきましょう。
Adding Pages to a Notification

通知にページを追加する


携帯デバイス上でアプリケーションを開くことなく、より多くの情報を提供したい場合には、Android Wearの通知に1つ以上のページを追加することが出来ます。
追加ページはメインの通知カードの右側に表示されます。複数ページをデザインするための情報は Design Principles of Android Wearを参照して下さい。
複数ページを持つ通知を作成する場合、携帯デバイスまたはタブレット上に表示するメインとなる(最初のページとなる)通知を作成することから始めます。次に、addPage()メソッドで1つのページ追加するか、addPage()メソッドでコレクション内の複数ページを追加します。
例として、通知に2つ目のページを追加するコードを示します。
[java]
// メインとなる通知のBuilderを作成します。
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.new_message)
.setContentTitle(“Page 1”)
.setContentText(“Short message”)
.setContentIntent(viewPendingIntent);
// BigTextStyleの2つ目のページを作成します。
BigTextStyle secondPageStyle = new NotificationCompat.BigTextStyle();
secondPageStyle.setBigContentTitle(“Page 2”)
.bigText(“A lot of text…”);
// 2つ目のページの通知を作成します。
Notification secondPageNotification =
new NotificationCompat.Builder(this)
.setStyle(secondPageStyle)
.build();
// メインとなる通知を作成し2つ目のページを追加します。
Notification twoPageNotification =
new WearableNotifications.Builder(notificationBuilder)
.addPage(secondPageNotification)
.build();
[/java]
では実際に実行してみましょう。
昨日作成したアプリケーションに追加してみましょう。ボタンをおした時の処理を以下のように修正します。
[java]
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// メインとなる通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// BigTextStyleの2つ目のページを作成します。
NotificationCompat.BigTextStyle secondPageStyle = new NotificationCompat.BigTextStyle();
secondPageStyle.setBigContentTitle(“Page 2”)
.bigText(“A lot of text…”);
// 2つ目のページの通知を作成します。
Notification secondPageNotification =
new NotificationCompat.Builder(getApplicationContext())
.setStyle(secondPageStyle)
.build();
// 定義済みテキストよる返答を追加
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();
// ウェアラブル通知の作成とリモート入力の追加
// メインとなる通知を作成し2つ目のページを追加します。
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.addPage(secondPageNotification)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
[/java]
それでは実行してみましょう。左にスワイプすると、ページが増えていることが確認できると思います。
notificationsampleapp

Android WearでRemoteInputを使って通知から音声入力を受け取るとろこまで試してみる

本日は、先日の記事を見ながら、実際にプロジェクトを作成して実行してみましょう。
先日はEclipseを使用しましたが、今日はAndroid Studioを使ってみましょう。
http://developer.android.com/sdk/installing/studio.html
より、Android Studioをダウンロードします。
android-studio-page
 
Macの場合、android-studio-bundle-133.1028713-mac.dmgがダウンロードされました。
ダウンロードしたdmgを開き、Android Studioをアプリケーションフォルダにドラッグ&ドロップします。
install-android-studio
 
起動します。設定ファイルのインポート画面になるのでそのままOKをクリック。
Complete Installation
 
起動中。
android-studio-starting
 
新しいバージョンがあることが示されています。More Infoを押すと更新内容をブラウザで表示します。
 
update-android-stuido
 
下部の「Check for updates now.」をクリックします。
 
checkforupdate
Update and restartをクリックしてアップデートします。完了するとAndroidStudioが再起動します。
update-info
新しいプロジェクトを作成します。
適当な名称をつけてNext。
new-project01
デフォルトのままNext。
new-project02
デフォルトのままFinishするとプロジェクトが作成されます。
new-project03
Tools > Android > SDK ManagerでSDKマネージャを開きます。
Android SDK Tools のバージョンがが22.6以上であることを確認します。
android-sdk-manager
「Android Wear ARM EABI v7a System Image」を選択します。
android-sdk-managar02
Android Support LibraryとAndroid Support Repositoryがインストールされているか確認します。インストールされていましたが最新版があるのでアップデートします。
android-sdk-managar03
インストールします。
android-sdk-managar04
ライセンスを承認してInstallをクリックするとインストールが開始されます。
android-sdk-managar05
Android Wearエミュレータを準備します。Tools > Android > AVD ManagerよりAVDマネージャを起動します。
Newをクリックして次のように設定します。
createAVD
OKをクリック。作成結果が表示されますのでOKで閉じます。
createAVDResult
作成したAVDを選択して、Startをクリックします。
startAVD
Launch from snapshotのチェックを外し、Save to snapshotにチェックを付けてLaunchをクリックしてAVDを起動します。
LaunchOptions
起動中。起動にはそこそこ時間がかかります。
startingAVD
startingWear
起動しました。起動したら一旦閉じることで、スナップショットを取ります。
startedWear
もう一度起動します。今度はSave to snapshotのチェックを外し、Launch from snapshotだけにチェックを入れてLaunchで起動します。以後はこの方法で起動すれば起動時間をいくらか短縮できます。
restartAVD
携帯端末をMacにUSB接続します。
次のコマンドを入力します。
[shell]
* cd /Applications/Android\ Studio.app/sdk/platform-tools
* ./adb -d forward tcp:5601 tcp:5601
[/shell]
携帯デバイスでAndroid Wear Preview起動します。青い部分をタップ。
AndroidWearPreviewNotice
通知へのアクセスが開くのでAndroid Wear Previewをタップ。
Android Wear Previewを有効にしますか?で「OK」をタップ。
これで準備は整いました。次はライブラリです。
libsディレクトリにwearable-preview-support.jar を追加します。ドラッグ&ドロップで追加できます。macの場合optionキーを押しながらドラッグ&ドロップでコピーになります。
copylibs
追加されました。
addlibs
build.gradleを開き次の依存ルールを追加します。
[text]
dependencies {
compile “com.android.support:support-v4:18.0.+”
compile files(‘../libs/wearable-preview-support.jar’)
}
[/text]
追加したら、ツールバーのボタンを押して反映します。
sync-gradle
さてここからはコーディングです。
Android Wearで応答した時に開くActivityを新規作成します。パッケージを右クリックして New > Activity > Blank Activity を選択します。
newActivity
Activityの新規作成画面になりますのでActivity Nameに「ReplyActivity」と入力してFinishをクリックして追加します。
newActivityCreate
まずは通知ボタンを追加します。activity_main.xmlを開きボタンを追加します。
add-button
MainActivity.javaにボタンを押したら通知を送信するようにコーディングします。
[java]
package com.example.androidweartestapplication.weartest;
import android.app.Activity;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
String replyLabel = “返信”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// 通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();
// ウェアラブル通知の作成とリモート入力の追加
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
[/java]
実行してみましょう。携帯デバイスを選択してOKをクリックします。
choose-device
アプリケーション上で「通知」ボタンを押してみましょう。
AndroidWearTestApp2
するとAndroid Wearに通知が届きます。
notification01
左にスワイプします。通常「Open」アクションが表示されていたいましたが「Reply」アクションが表示されています。「Reply」をタップします。
notification02
音声入力の画面になります。
notification03
エミュレータでは音声認識は使用できませんので、かわりにキーボードで入力します。
notification04
入力後しばらくく待つと再入力または保存の画面になります。
notification06
Saveボタンのインジゲータが一周りし、Doneと表示されれば完了です。
notification07
端末ではReplyActivityが起動していることが確認できます。
ReplyActivity
では次に、定義済みテキストによる応答を試してみましょう。まずはXMLにreply_choicesを追加します。
strings.xml
[xml]
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android Wear Test Application</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="title_activity_reply">ReplyActivity</string>
    <string name="reply_label">返信</string>
    <string-array name="reply_choices">
        <item>Yes</item>
        <item>No</item>
        <item>Maybe</item>
    </string-array>
</resources>
[/xml]
ボタンを押した時の処理を次のように修正します。
[java]
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// 通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// 定義済みテキストよる返答を追加
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();
// ウェアラブル通知の作成とリモート入力の追加
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
[/java]
実行してみましょう。左にスワイプしてReplyをタップします。すると選択肢が表示されています。タップして返信することが出来ます。
notification08
もちろんここで音声入力を開始すれば認識されます。
notification09
では最後に、Android Wearで返信した文字列を端末側で受け取るようにします。レイアウトに文字列を表示するためのTextViewを配置します。
activity_reply.xml
[xml]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.androidweartestapplication.weartest.ReplyActivity">
    <TextView
        android:text="@string/title_activity_reply"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/reply_text" />
</RelativeLayout>
[/xml]
Android Wearから受け取った文字列をTextViewに表示します。ReplyActivityのonCreateに処理を追加します。
ReplyActivity.java
[java]
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reply);
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
Intent i = getIntent();
String reply = i.getStringExtra(EXTRA_VOICE_REPLY);
TextView text = (TextView)findViewById(R.id.reply_text);
text.setText(reply);
}
[/java]
実行してみましょう。
音声入力を開始し、「I love key lime pie!」と入力します。
notification10
完了すると、端末側に「I love key lime pie!」と表示されます。あとは端末側でこのメッセージを投稿するなりすればアプリケーションとしては完成ですね。
llovekeylimepie