Android Studioを使用して、とりあえず動くWatch faceを作る(1/3)

冬休みに、色々なサイトを参考にしてAndroid wear用のWatch faceを作りました。
その時の手順をメモがてらにまとめてみました。

#対象

* Eclipse + ADT 又は Android Studioを使用して、"Hello, World"を表示したことがあるくらいの人。
* 利用したのはMacなので、Windowsを使用するときは、画面や手順に若干の差異があるかもしれません。

#環境構築

まずは、[Android developersのサイト](http://developer.android.com/sdk/index.html)から、Android Studioをダウンロードします。ダウンロードができたら、Android SDKのアップデートや、JDKのパス設定を行いましょう。
##Android SDKのアップデート
* Android Studioのメニューから、"Tools"→"Android"→"SDK Manager"を選択し、SDK Managerを起動します。
* SDK toolsはVer.23以上のものを、SDKについてはAndroid 5.0(API21)以上のものを、すべてダウンロードしておきましょう。（Android wearアプリのなかでも、Watch faceアプリ作成のためには、API21が必要です。）

>[Update Your SDK
](https://developer.android.com/training/wearables/apps/creating.html#UpdateSDK)

##JDKのパス設定

* 以下のサイトが参考になると思います。

>[Android StudioにおけるAndroidSDKやJDKのパス設定](http://qiita.com/hidekuro/items/d2aadb907c617a4554db)

#プロジェクト作成

##Watch face作成用のプロジェクト作成

* Android Studioのメニューから、"File"→"New Project"で、新規プロジェクトを作成します。
* "Select the form factors your app will run on"のところで、"Phone and Tablet"と、"Wear"を選びます。APIは、それぞれ21にします。[^1]
* その後は、とりあえずすべてデフォルトの設定で。(Blank Activity）

[^1]: なぜ"Phone and Tablet"についても選ぶかですが、Google Play storeにおいて、Watch Faceのようなwearableアプリは、"companion"と呼ばれる、PhoneやTablet用のアプリにバンドルされる形で配信されるからです。Google Play storeにて配信するのでなければ、Wearのみでも良いかと思います。>[Creating and Running a Wearable App](https://developer.android.com/training/wearables/apps/creating.html)

##Dependenciesの設定

![スクリーンショット 2015-01-03 18.29.03.png](https://qiita-image-store.s3.amazonaws.com/0/63716/2099fc05-b6fb-3711-155a-6231de318a26.png)

* 画面左上の部分から、build.gradle(Module: mobile)を開きましょう。
* 以下のように設定されているかを確認します。（数字部分は微妙に異なる可能性があります）

```
apply plugin: 'com.android.application'

android { ... }

dependencies {
    ...
    wearApp project(':wear')
    compile 'com.google.android.gms:play-services:6.5.+'
}
```

* 次に、同様にしてbuild.gradle(Module: wear)を開きましょう。
* 以下のように設定されているかを確認します。（数字部分は微妙に異なる可能性があります）

```
apply plugin: 'com.android.application'

android { ... }

dependencies {
    ...
    compile 'com.google.android.support:wearable:1.1.+'
    compile 'com.google.android.gms:play-services-wearable:6.5.+'
}
```

>[Create and Configure Your Project](https://developer.android.com/training/wearables/watch-faces/service.html#CreateProject)の、Dependencies

##Permissionsの設定

* Watch faceアプリには、"PROVIDE_BACKGROUND"と"WAKE_LOCK"の2つのpermissionの宣言が必要となります。"PROVIDE_BACKGROUND"は、mobileからwearに自動的にアプリをインストールすることを許可するパーミッションです。また、"WAKE_LOCK"は、WakeLockクラス(アプリの起動状態の管理)を利用できるようにするものです。

>[Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方(2/3)](http://www.atmarkit.co.jp/ait/articles/1412/03/news049_2.html)

![スクリーンショット 2015-01-03 19.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/63716/3b6add27-8909-d25b-d129-52af6ac02c61.png)

* 画面左上の部分から、wearのAndroidManifes.xmlを開きましょう。
* 以下のように\<uses permission>を設定します。とりあえず、\<manifest ...>のすぐ後に入れましょう。

```
<manifest ...>
    <uses-permission
        android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
    <uses-permission
        android:name="android.permission.WAKE_LOCK" />
    ...
</manifest>
```

* 今度は、mobileのAndroidManifest.xmlを開きます。
* wearと同様に、以下のように設定します。こちらも、ひとまず\<manifest ...>のすぐ後に入れましょう。
* wearで宣言したパーミッションは、mobileでも必ず宣言する必要があります。

```
<manifest ...>
    <uses-permission
        android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
    <uses-permission
        android:name="android.permission.WAKE_LOCK" />
    ...
</manifest>
```

>[Create and Configure Your Project](https://developer.android.com/training/wearables/watch-faces/service.html#CreateProject)の、Declare Permissions

#Serviceの作成と設定

Watch faceは、Serviceとして定義します。当該Serviceは、Watch faceが起動中に、時間が進んだ時や、重要なeventが発生した時に、システムから呼び出され実行される事となります。（重要なevent:アンビエントモードへの（からの）移行時、新しいnotificationの受領時等）


そこで、Serviceの作成と、当該ServiceについてAndroidManifest.xmlへの登録が必要となります。

##Serviceファイルの作成

* wear→java→xxx.xxx.xxx内の、"MainActivity.java"を削除します。
* 同じ場所に、"AnalogWatchFaceService.java"というファイルを作成します。[^2]
[^2]: "〜.java"という形であれば名前はなんでもいいです。


![スクリーンショット 2015-01-03 20.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/63716/42fbfbee-a352-7e4a-a088-f1efb47ed111.png)


>[Create and Configure Your Project]
(https://developer.android.com/training/wearables/watch-faces/service.html#CallbackMethods)

##AndroidManifest.xmlからのactivityの削除、およびserviceの登録

* wear内の、AndroidManifest.xmlを開きます。
* AndroidManifest.xmlから、\<activity ...>〜\</activity>を削除します。

```
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
```

* 上記\<activity ...>〜\</activity>があった場所に、以下を挿入します。

```
<service
    android:name=".AnalogWatchFaceService"
    android:label="@string/app_name"
    android:allowEmbedded="true"
    android:taskAffinity=""
    android:permission="android.permission.BIND_WALLPAPER" >
    <meta-data
        android:name="android.service.wallpaper"
        android:resource="@xml/watch_face" />
    <meta-data
        android:name="com.google.android.wearable.watchface.preview"
        android:resource="@drawable/preview" />
    <meta-data
        android:name="com.google.android.wearable.watchface.preview_circular"
        android:resource="@drawable/preview_circular" />
    <intent-filter>
        <action android:name="android.service.wallpaper.WallpaperService" />
        <category
            android:name=
            "com.google.android.wearable.watchface.category.WATCH_FACE" />
    </intent-filter>
</service>
```

android:allowEmbedded="true"は、このactivity(service)を、他のactivityの埋め込み子アクティビティとして起動できるようにするものです。
android:taskAffinity=""は、このactivity(service)を、いずれのactivityとも異なるaffinityとして設定し、独立したTaskとして設定しています。Taskは、activityの集まりです。[^3]
[^3]: [App Manifest](http://developer.android.com/guide/topics/manifest/activity-element.html)
android:permission="android.permission.BIND_WALLPAPER"は、WallpaperServiceクラスを使用する際に必要です。

android.service.wallpaperは、Live wallpaperのリソースを定義しています。
com.google.android.wearable.watchface.preview及びcom.google.android.wearable.watchface.preview_circularについては、それぞれ四角形と円形のwatch faceアプリにおけるプレビューとして表示される画像のリソースを定義しています。

##watch_face.xml（resource file）の作成

* wear→resに、"xml"Directoryを作成し、その中に"watch_face.xml"というファイルを作成します。
* "watch_face.xml"の中身は、以下のようにします。

```
<?xml version="1.0" encoding="UTF-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />
```

![スクリーンショット 2015-01-03 21.08.24.png](https://qiita-image-store.s3.amazonaws.com/0/63716/9cbe8291-e679-6c34-264e-017d3ad97389.png)

#Serviceの実装以降
[2/3](http://qiita.com/eoppp/items/dc602fae65bc71a69d83)に続きます。

#参考にしたサイト等
>[美女時計を作ろう！Android Wear開発入門 30分で作る盤面アプリ](http://blog.btrax.com/jp/2014/12/16/develop-watch-face/)
>[Building a Watch Face Service](https://developer.android.com/training/wearables/watch-faces/service.html)(Android developers)