Android WearからMobileへメッセージを送る

WaerとWearって紛らわしいですよね。
http://www.appbank.net/2013/10/31/iphone-application/693334.php

今回はAndroid Wearから携帯電話へメッセージを送るチュートリアルです。
同期的・非同期的やサービスなど、一重にメッセージを送るだけでもいくつか手段がありますが今回は
`Android Wearからスマホへ、非同期にメッセージを送る`
という事だけ達成出来ればと思います。

##1 既存プロジェクトにAndroid Wearのモジュールを追加する
![スクリーンショット 2015-02-06 2.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/24979/3c817f41-ae0e-0638-8c54-f73aba208d6a.png)
File>New Module...
からモジュールを追加します。
![スクリーンショット 2015-02-06 2.18.26.png](https://qiita-image-store.s3.amazonaws.com/0/24979/de82118d-c475-c0d6-a7e1-2a509a872d89.png)
今回はWatch InterFaceなのでAndroid Wear Moduleを選択します。
![スクリーンショット 2015-02-06 2.20.03.png](https://qiita-image-store.s3.amazonaws.com/0/24979/14e42c48-c89f-b812-888e-b453cdbf629c.png)
Packgae name:は必ずスマホ用のアプリと同じにしてください。（同じにしないとメッセージの送信が届きません。これで１日無駄にしました。）
この後は気にすることはありません。finishまでnextを押し続けます。


##2 時計側からの送信部分を書く

概要は、ボタンを押したら送信されるという感じです。
以下は時計側のコードです。

```java:MainActivity.java

@Override
        public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            initApi();
            Button button = new Button(this.getActivity());
            button.setText("OK");
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sendToast(getActivity());
                }
            });
            return button;
        }

private void sendToast(final Context context) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    GoogleApiClient client = new GoogleApiClient.Builder(context)
                            .addApi(Wearable.API)
                            .build();
                    client.blockingConnect(100, TimeUnit.MILLISECONDS);
                    NodeApi.GetConnectedNodesResult result =
                            Wearable.NodeApi.getConnectedNodes(client).await();
                    List<Node> nodes = result.getNodes();
                    if (nodes.size() > 0) {
                        client.blockingConnect(100, TimeUnit.MILLISECONDS);
                        Wearable.MessageApi.sendMessage(client, nodes.get(0).getId(), "hello", null);
                        client.disconnect();
                    }
                    client.disconnect();
                }
            }).start();
        }
```

##3 受信側のサービスを作る

受信側のサービスを作ります。
概要は、メッセージを受け取ったらトーストを表示する。です

スマホアプリの方にWatchServiceというjavaファイルを作り以下のように実装します。

```java:WatchService.java
public class WatchService extends WearableListenerService {
    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        showToast(messageEvent.getPath());
    }

    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}
```

##4 AndroidManifest.xmlの修正

```xml:AndroidManifest.xml
<meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
```
上記の記述をスマホ・時計の両方のAndroidManifest.xmlのApplication下に書きます。

```xml:AndroidManifest.xml
        <service
            android:name=".WatchService" >
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
            </intent-filter>
        </service>
```
上記をスマホ側のAndroidManifest.xmlのApplication下に書くことでWatchServiceを受け取る準備をさせます。

##5 実行
スマホ側・時計側のアプリをそれぞれインストールさせて、時計側のボタンを押してスマホにトーストが表示されれば成功です！