Android Wearアプリを作ってみた

DSC_0072 (3)

こんにちは。 この間Apple Watchが発売されましたね。

ウェアラブルな端末には私も興味があり去年の年末にSmart Watch3を購入しました。 スマホをポケットに入れていていると通知に気づかない場合がよくあるのですが、腕に直接振動がくるので通知を見逃すことがなくなりました。また、いちいちポケットからスマホを取り出すことなくルート案内や各種情報が確認もできるので結構便利です。 アイデアによっては用途がもっと広がっていく可能性がありそうですね。

さて、Smart Watch3はAndoroid WearというOSを搭載していて、Android Wear上で動作するアプリを作るためのSDKも公開されております。 これはもう何か作ってみるしかないですね。

Apple Watchが発売されて間もない時期で、かなり空気が読めていない感があり大変恐縮なのですが、試しにAndroid Wearアプリを作成してみましたので、今回は作成したアプリの紹介と実装方法等を少しお話ししたいと思います。

まだAndroid WearアプリはおろかAndroidアプリすら作成したことがなく、あまり凝ったものでもなく見た目はダサいですが、一応?Salesforceを利用する形にしておりますので、Android WearとSalesforceを利用して何かしてみたい方のご参考になれば幸いです。

どんなアプリ?

タスク確認・登録画面スケジュール確認画面

今回作成したアプリでできることです。

  • 未完了タスクの確認
  • 新規タスクの追加
  • タスクの完了
  • Salesforceの行動をGoogleカレンダーに連携(オマケ)
  • 今日の予定の確認(オマケ)

Android Wear上でタスクの管理ができます。 SalesforceのToDoを利用したアプリです。 こんだけしかできませんが開発環境の構築やアプリの実装に慣れない部分があり結構時間がかかりましたw 機能を一つずつコードを交えながら説明します。

未完了タスクの確認

Android Wearで今回作成したアプリを起動すると未完了のタスクを確認できます。

タスク確認・登録画面


スクロールして未完了の全タスクを確認できます。

タスクはSalesforceのToDoを表示していますが表示の度にデータをSalesforceから取得しているわけではありません。

Smart Watch3単体ではインターネットに接続することができないので、まずスマホ側のプログラムでSalesforceのRestAPIを呼び出してToDoオブジェクトのレコードを取得します。

そしてスマホで取得したデータを、Wearable Data Layer APIというものでToDoデータをSmartWatch3に同期して画面に表示しています。

ちなみに、Android Wearがアップデートされれば今後はWi-Fi経由で単体でインターネットに接続できるようになるようです。Smart Watch3はそろそろかな?

Salesforceへの接続部分はSalesforce Mobile SDKを使用しており、あらかじめスマホ側でOAuth認証を済ませている前提です。

一定時間ごとにSalesforceからデータを取得するのではなくて、変更の通知を受けてからデータを取得する方がAPIの消費量を考えるとベストなのかな・・・

タスク確認画面(Activity)のWearable Data Layer APIを呼び出している部分です。

GoogleApiClientを取得してWearable Data Layer APIを非同期で呼び出し、スマホと同期されたToDoデータを取得しています。

当該処理は、この後説明する別画面(別Activity)でタスクを追加した後に再度実行して画面をリフレッシュさせたいので、画面(Activity)のライフサイクル的にOnStartをオーバーライドして実装しています。 onResumeの方が無難だったりするのかな?

新規タスクの追加

タスク確認・登録画面


アプリの起動後に画面上部の「add」ボタンをクリックすると音声入力画面に遷移します。

音声入力画面


Smart Watch3に限らず文字の入力は基本的に音声入力となり、新規追加するタスクの件名を音声で入力してもらう想定です。 「add」ボタンクリック時のプログラムは下記です。

上記メソッドの最後(7行目)で「startActivityForResult」メソッドを呼び出していますが、第一引数に渡した画面の処理が完了すると、下記の「onActivityResult」メソッドが呼び出され、確認画面に遷移するように実装しています。

音声入力結果確認画面


確認画面では3秒経過すると自動的にToDoを追加するように実装していて、音声が誤認識されて再度音声入力したい場合は×ボタンを押下してもらう想定です。 確認画面は一定時間経過後に自動で処理をさせたかったので「DelayedConfirmationView.DelayedConfirmationListener」インターフェイスを実装しております。

最後にSalesforceのToDoオブジェクトへレコードを追加する部分です。 上の確認画面で3秒が経過すると、先ほどもでてきたWearable Data Layer APIを呼び出し、まずSmart Watch3上でデータを追加します。 スマホ側のプログラムでWearableListenerServiceクラスを継承したクラスを作成しており、Wearable Data Layer APIでデータの変更が検知されると非同期でWearableListenerServiceのonDataChangedメソッドが呼び出されます。

そのタイミングでSalesforceのRestAPIを呼び出してToDoオブジェクトにレコードを追加しています。 また、ToDoの追加処理と並行して、Smart Watch3上でタスクの一覧画面を再描画して追加したタスクが表示されるよう実装しております。

タスク確認・登録画面

タスクの完了

新規タスクの追加処理とほぼ同様の方式でSalesforceのToDoレコードを更新しております。

今日の予定の確認&Salesforceの行動をGoogleカレンダーに連携(オマケ)

Android Wearではスマホ側で設定されているアカウントのGoogleカレンダーの今日の予定を標準機能で確認することが可能です。

スケジュール確認画面


もともとSalesforceの行動をGoogleカレンダーに連携する処理を実装するつもりなかったのですが、せっかくAndroid WearにGoogleカレンダーの予定を表示する機能があるのでSalesforceの行動をGoogleカレンダーへ同期してSmart Watch3でSalesforceの行動を表示させてみたくなりました。 ※オマケ機能なのですが、この機能の実装が一番骨が折れました・・・

Android Wearには予定を表示する機能があるので実装は不要です。 スマホ側に下記のような設定画面とバックグラウンドで動作するプログラムを作成しました。

設定画面


詳細な説明は省きますが、SalesforceからGoogleカレンダーへ行動データの同期を実行する間隔と、同期先のカレンダーを選択すると自分の行動をGoogleカレンダーへ同期します。

指定した時間や間隔でプログラムを実行するAlarmManagerというクラスが用意されているので、定期的にバックグラウンドで動作するサービスでSalesforceから行動データを取得してGoogleカレンダーへ差分登録する処理を実行しています。

その結果、Smart Watch3上でGoogleカレンダー本体の今日の予定の他に、Salesforceに登録されている今日の行動も一緒に確認することが可能です。

また、Googleのカレンダーアプリ等をスマホ上で表示すれば、今日のみに限らず週単位や月単位でもGoogleカレンダーの各カレンダーの予定と一緒にSalesforceの行動を確認することが可能です。

Screenshot_2015-05-20-09-59-45

最後に

今回作成したアプリは、Salesforceの組織側に特に何か手を入れなくても動作するものを作成しましたが、岩井の記事にもある通り、活動にApexトリガ等を仕込めばGCM⇒スマホ⇒Wearへの通知なんかも可能だと思います。

また、今回はSmartWatch3に搭載されている各種センサー(光、ジャイロ、磁気、加速度、GPS)は一切使用しておらず、音声入力やWearとスマホのデータの同期に関する処理のみ実装しておりますが、各種センサーとアイデア次第では面白いアプリが作成できるのではないでしょうか。

この間社内の人達とIoTのハッカソンに参加するべく各種センサーを使用したアイデアを考えたのがとても面白かったので、何れかのセンサーを利用したアプリを何か作りたいな~