いつも使っている glide.so というサービスが滅びたので、このままやります。
Android と連携して良い感じにしてくれる腕時計型デバイス。
- 通知転送してくれて便利
- 通知や着信をスルーすることが減る
- 音声入力できてわりと精度がいい
- Yo ができる
-
LG G Watch
-
Moto 360
まるい
- SmartWatch 3
- Android のサブセット OS が動いてる
- Wear アプリは電話機アプリと別プロジェクトで開発するし apk も別になる
- インストールやデバッグも独立して行う
- なのでアプリのアンインストールができない (
adb uninstall hoge
とかすると消せる)
- しかし単体で配布できない
- 単体で Google Play にアクセスできないので
- アプリを配布する場合は電話機アプリと一緒に配布する
- 通知からの返信
- 音声入力
- ランチャーアプリを入れればタッチでアプリ起動ができる
買ってからあまり時間が経っていないので Hello World 動かしたくらいだけどザックリ調べたことを紹介します。
- Wear アプリは独立して動いているので PC と直接 adb で繋がりたい
- PC と USB などで接続された電話機を経由して Bluetooth でデバッグ接続できる
- IDE とかがよしなに繋いでくれたりはしないので自分でコマンドを叩いて接続する
adb forward tcp:4444 localabstract:/adb-hub; adb connect localhost:4444
丸い端末と四角い端末のリソースファイルをそれぞれ定義できる。腕時計の形によって適宜つかわれる模様 (丸い時計を持ってないので検証してない) 。
- wear_activity_rect.xml
- wear_activity_round.xml
Android の通知が全部転送されてくるけど、 Wear 用にフラグを立てると、その通知に返信とかの機能を付けることが出来る。 PendingIntent を作って起動する Activity を定義しておく。
Notification n = new NotificationCompat.Builder(context)
.setContentTitle("新着メッセージがあります")
.setContentText("xxさんからメッセージが届いています")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pIntent)
.addAction(R.drawable.ic_launcher, "返信", pendingIntent)
.build();
- 返信のメニューを作ったところで返信する内容をユーザは入力する必要がある
- RemoteIntent を使うと音声入力できるようになる
- デフォルトの選択 (はい/いいえ) とかも設定できる
- これで入力した文字列は Intent の
NotificationActivity.EXTRA_VOICE_REPL
という所に入っている
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel("xx会議に参加しますか?")
.setChoices(new String[] {"はい", "いいえ"})
.build();
Notification notification =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("出席確認")
.setContentText("xx会議の出席確認です")
.extend(new NotificationCompat.WearableExtender().addAction(action))
.build();
- Notification にページを作ることが出来る
- Google Hangouts とかだと、発言の通知→最近の発言 (20 件くらい) → 返信メニューという風になってる
- スタックを作ることが出来る
- 通知を未読のまま次の通知が来たときとかに「他 2 件の通知」というような感じに表示させることができる
- もちろん中身は Android なので Activity を動かすこともできる
- 使えない View 部品もあるけど、だいたい使えるらしい
- WebView すらつかえる
- ちなみに Wear 上で動くウェブブラウザアプリもある
- Android Wear と電話機でデータをやりとりする時に使う API
- 送れるのは文字列だけ
- Wear 上のボタン操作を電話機に通知するときとかに使う
MessageApi.SendMessageResult result =
Wearable.MessageApi.sendMessage(mGoogleApiClient, node, START_ACTIVITY_PATH, null).await();
@Override
public void onMessageReceived(MessageEvent messageEvent) {
if (START_ACTIVITY_PATH.equals(messageEvent.getPath())) {
Intent intent = new Intent(this, WatchActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
- Android Wear と電話機でデータをやりとりする時に使う API
- Message API と違って Bundle みたいなものを "同期させる"
- やりとりではなくて同期なので、中身を書き換えると変更イベントが飛んできたりする
PutDataMapRequest dataMap = PutDataMapRequest.create(COUNT_PATH);
dataMap.getDataMap().putInt(COUNT_KEY, count++)
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request);
pendingResult.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
Log.d(TAG, "count updated:" + count);
}
});
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
DataItem dataItem = event.getDataItem();
if (COUNT_PATH.equals(dataItem.getUri().getPath())) {
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
int count = dataMap.getInt(COUNT_KEY);
}
}
}
- http://www.android.com/intl/ja/wear/
- http://ja.wikipedia.org/wiki/Android_Wear
- http://www.buildinsider.net/mobile/androidwear/01
- https://developer.android.com/reference/com/google/android/gms/wearable/MessageEvent.html
- https://developer.android.com/reference/com/google/android/gms/wearable/DataMap.html