YAMAPのAndroid Wearアプリを作って思ったこと

![icon175x175.jpeg](https://qiita-image-store.s3.amazonaws.com/0/53996/fb9f8746-23b3-d954-b0e7-9487e8841d75.jpeg)

YAMAPのWearアプリを作ったので、いろいろ思ったことを書きます。(Android Wearの日本語の記事が少ないので、少しでも増やしたいなという思いも少し...)

YAMAPについては、 [こちら](https://yamap.co.jp/)を見てください。(登録してもらうと、嬉しいです^^)


[Androidのイベント](http://www.zusaar.com/event/15537003)でこの事を話しました。
[スライド](https://speakerdeck.com/gupuru/yi-wai-towearhada-bian-desu)です。

# 経緯

当初は、Android WearやApple Watchなどのアプリを作る予定はありませんでした。
理由として、画面が小さい, もう少しこの分野の流れを見極めるなどです。
しかし、ある日...

```
Wearのアプリ作らへん？

-> はい？

今度、カシオさんが作るスマートウォッチ、結構画面が大きかったら、良いなと思って(^^)

-> お、おう...
```

こんな感じでWearアプリの作成が決まりました。
ちなみに、今回作ったWearアプリはカシオさんの[スマートウォッチ](http://wsd.casio.com/)で使えます。

# 主な機能
Wearアプリの主な機能は以下のものになりました。

1. 地図表示
1. 地図上に現在地表示
1. 地図上に今まで歩いた軌跡を表示
1. Wearから活動記録開始・終了させる
1. 緯度, 経度, 標高などの情報の表示

簡単に言いますとミニYAMAPです（笑）
4と5は、できるなと思ったのですが、1, 2, 3は、本当にWearで出来るのか...?

## 地図

ここで軽くYAMAPで使用している地図について説明します。
地図は256×256pxのjpgの画像を使っています。
これが一つの山に100枚以上あり、それらをタイル上に描画しています。
一つの山で平均20MB。大きいもので40MBくらいあります。

![33333.png](https://qiita-image-store.s3.amazonaws.com/0/53996/47424695-e492-1658-7695-b319d316c0d7.png)

## 地図描画

今回、Wearの地図描画は、[TileView](https://github.com/moagrius/TileView)というライブラリを使用しました。
これを知ったのは、[Mini Maps for Wear](https://play.google.com/store/apps/details?id=net.dheera.wearmaps&hl=ja)というアプリがきっかけです。

なんと、このアプリは[GitHub](https://github.com/dheera/android-wearmaps)にコードを公開していたので、読んでみると地図描画辺りにtileViewというものがあったので、これを調べていくと今回使用したライブラリを見つけました。

TileViewは地図描画だけでなく、マーカーや線も引けるので上記の1〜3はクリアできました。

## ボツ案

TileView以外に、以下のもので地図描画を実現しようと考えていました。

- スマホに表示されている地図画面のスクショをとりWearに転送
- Google Maps Android APIのTile Overlays

スクショの場合、地図の未転送部分にドラッグされると、未転送部分をスマホから取得するのですが、表示までに約1〜2秒ほどかかり、少し遅いということでボツ...

WearのGoogle Mapsは、[Tile overlays are not supported on wearable devices.](https://developers.google.com/maps/documentation/android-api/wear#supported_functionality_in_the_maps_api_on_android_wear)となっていたので、使えませんでした...

# 地図データの転送

描画の次は、地図データの転送です。
20MBや40MBの地図データをどうやってWearに転送するか。

Zipにして送りました...(これが正解かどうか、今でも分からない...)
地図データをZipにして、[ChannelApi](https://developers.google.com/android/reference/com/google/android/gms/wearable/ChannelApi) を使いWearに転送し、転送完了後、解凍して端末に保存しました。

ChannelApiを使用したのは、[ここ](http://developer.android.com/intl/ja/training/wearables/data-layer/index.html)に

```
You can use the ChannelApi class to transfer large data items,
such as music and movie files, from a handheld to a wearable device.
```

と書いていたので、平均20MBもあるからこれを使うと良いのかな...という感じです。

Zip以外にも...

[MessageApi](https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi)や[DataApi](https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi)などを使い、一枚ずつ送るというやり方も試しました。

一枚ずつだと、遅い、たまに転送が失敗することがある。（ここは僕の組み方が悪いのが問題かも...）
転送時間が掛かり過ぎるのが問題になりまして、これはボツになりました。
ただ、この方法は転送に失敗しても、未転送の部分から送り直すことができる点は良いと思います。

転送の部分は、今でも悩んでいるのですが、良いやり方があれば教えていただけると助かります。

# 今後、Wearアプリを作るときに注意する所

Wearアプリを作る際に注意する所を書きます。

## 本当にWearアプリを作る必要性があるのか。

Wearアプリを作ると、当たり前ですが検証端末は増えます。
今より検証する時間が増えます。そして、アプリの容量も増えます。
このスマホとこのWearだけにしか起きないバグとかも出てくると思います。
なので、スマホで済みそうならスマホにしましょう。無理して作る必要はないと思います。

## WearのUIデザイン

Wearの画面は小さいです。恐ろしく小さいです。
ボタンを３つも４つも置くと押しづらいです。
![スクリーンショット 2016-03-21 14.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/53996/23a75fec-b9ea-18a8-490c-0e37ae1e4bdc.png)

フォントサイズも、普段より少し大きめにしないと読みにくいです。
さらに画面は、丸型とスクエア型があるので２つUI考える必要があります。

## Wearアプリは、できるだけシンプルに。

Zip転送や地図描画など、こんなことはやらないほうが良いです。(地図描画は、もう少しAndroid Wear業界が成熟してからやったほうが楽だったのでは...)

## スマホとWearの通信は100％うまくいくとは限らない。

当たり前だと思いますが、100%上手くいくと思う人もいるので、ここは事前にすり合わせしときましょう。
なので、通信失敗するという前提で設計しましょう。

## 日本語のドキュメントが少ない。

[本](http://www.amazon.co.jp/dp/4774177490/ref=cm_sw_r_tw_dp_aB47wb1EMYKNX )も、1冊くらいしかないです。(Apple Watchは3, 4冊あるけどね...)
英語のほうが情報は多いので、英語が苦手な人は頑張りましょう(๑˃̵ᴗ˂̵)و

## すでにあるスマホアプリに新しくWearを入れる際は、事前の検証をしっかり。

秘伝のタレ状態のところに新たにWearの機能をいれるのは大変です。
この辺の検証は、作る前に事前に確認しといたほうが作るときにスムーズです。

# 最後に

意外とWearは大変です（笑）
MessageApiやChannelApiなどのことは、別の記事で書きたいと思います。
Wearに関しては、僕もやり始めたばかりなので、良ければいろいろ教えてください。