Skip to content

Instantly share code, notes, and snippets.

@shunirr
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shunirr/3bdcf52d7a16a899b907 to your computer and use it in GitHub Desktop.
Save shunirr/3bdcf52d7a16a899b907 to your computer and use it in GitHub Desktop.

最近買った腕時計の話

いつも使っている glide.so というサービスが滅びたので、このままやります。

LG G Watch 買いました

Android Wear について

Android と連携して良い感じにしてくれる腕時計型デバイス。

  • 通知転送してくれて便利
  • 通知や着信をスルーすることが減る
  • 音声入力できてわりと精度がいい
  • Yo ができる

Android Wear 端末

  • LG G Watch

  • Moto 360

まるい

  • SmartWatch 3

Android Wear の仕組み

  • Android のサブセット OS が動いてる
  • Wear アプリは電話機アプリと別プロジェクトで開発するし apk も別になる
  • インストールやデバッグも独立して行う
  • なのでアプリのアンインストールができない (adb uninstall hoge とかすると消せる)

アプリの配布

  • しかし単体で配布できない
    • 単体で Google Play にアクセスできないので
  • アプリを配布する場合は電話機アプリと一緒に配布する

アプリの起動

  • 通知からの返信
  • 音声入力
  • ランチャーアプリを入れればタッチでアプリ起動ができる

Twitter とかのデモ

開発

買ってからあまり時間が経っていないので 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

Notification

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();

RemoteInput

  • 返信のメニューを作ったところで返信する内容をユーザは入力する必要がある
  • 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

  • Notification にページを作ることが出来る
    • Google Hangouts とかだと、発言の通知→最近の発言 (20 件くらい) → 返信メニューという風になってる
  • スタックを作ることが出来る
    • 通知を未読のまま次の通知が来たときとかに「他 2 件の通知」というような感じに表示させることができる

Wear 上で Activity を作る

  • もちろん中身は Android なので Activity を動かすこともできる
  • 使えない View 部品もあるけど、だいたい使えるらしい
  • WebView すらつかえる
    • ちなみに Wear 上で動くウェブブラウザアプリもある

Message API

  • 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);
  }
}

Data API

  • 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);
    }
  }
}

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment