Xamarin for Visual Studio で Android Wear 開発

こんにちは。エクセルソフトの田淵です。

無事 Xamarin for Visual Studio でも Android Wear アプリの開発が出来ることを確認しましたので、備忘録として残します。

# 必要なシステム

- Visual Studio Professional (Xamarin の対応は 2010 以上ですが最新版を使いましょうｗ)
- Android SDK 20 (2014/11/18 現在の最新版で大丈夫です)
![AndroidSDK20.png](https://qiita-image-store.s3.amazonaws.com/0/32453/4de218be-8fa8-35db-cda3-f1d7edbcaf35.png)
- Xamarin for Visual Studio Beta 3.8.134.0 (丁度今日 2014/11/18 に 3.8.145 がリリースされました。。まだ試していません。。)

# 事前準備

実機の Android Wear 端末か、Wear Emulator を用意して、実機の Android 端末と接続しておきましょう。詳細は以下をご参照ください。
[Windows の Android Studio で Wear アプリを動かす - Qiita](http://qiita.com/ytabuchi/items/561e7d58c6174fe6b9b9)

>エミュレーターを使用する場合は、`Hardware Keyboard present` にチェックが入っていると、Speak Now の時にキーボードで文字を入力できます。
![スクリーンショット 2014-11-18 14.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/32453/0ff9e44f-e599-15cf-d0e9-1808c301d5fd.png)

接続済み となっていて、デモカードが動作していれば問題ありません。
![スクリーンショット 2014-11-18 14.15.31.png](https://qiita-image-store.s3.amazonaws.com/0/32453/51a36a99-efd2-9074-d5e1-167b962ea802.png)

>実機の画面は [Android Screen Monitor](http://adakoda.github.io/android-screen-monitor/) を使って PC に表示しています。

# 開発してみよう

Visual Studio を起動し、`Android > Blank App (Android)` で新しいプロジェクトを作ります。
![スクリーンショット 2014-11-17 20.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/32453/f93615d6-35d6-c767-64a3-b988b5b2d216.png)

Wear は Android 4.3 以上の端末が要件ですので、プロジェクトのプロパティで `Minimum Android to Target` を API 18 (v4.3) にします。
![スクリーンショット 2014-11-18 14.19.49.png](https://qiita-image-store.s3.amazonaws.com/0/32453/5bde28a2-4487-f8a0-2a1f-9b3a9dbcc9c5.png)

Wear 対応のアプリを開発するには `Xamarin Support Library v4` が必要になりますので、 NuGet から取得します。
パッケージマネージャーから PM> `Install-Package Xamarin.Android.Support.v4 -Version 20.0.0.4` としても構いません。(依存関係で Xamarin.Android.Support.v13 もインストールされる事があるようです)
![スクリーンショット 2014-11-17 22.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/32453/bc3e34dc-0609-fdd4-fdbe-59b29c359148.png)

後は色々見ながらコードを書いていけば大丈夫です！

ちょうど、[Amazon.co.jp： 日経ソフトウエア 2014年 12月号: 日経ソフトウエア: 本](http://www.amazon.co.jp/dp/B00O94B2FA) で Android Wear 特集が掲載されていたので、そのコードを Xamarin で動くように写経しました。GitHub にアップしましたので、興味があれば見てみてください。

[Android/Wear_Sample at master · ytabuchi/Android](https://github.com/ytabuchi/Android/tree/master/Wear_Sample)

動作イメージ：
https://www.youtube.com/watch?v=sUP3RSLziKs

以下のようになりました。

```csharp:MainActivity.cs
using Android.Support.V4.App;
...
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);

            Button button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate
            {
                // Wear の入力画面を構築
                // RemoteInput.Builder だと Android.RemoteInput と競合するのでフルで指定しています。
                // 正式な書き方は不明です。。
                var remoteInput = new Android.Support.V4.App.RemoteInput.Builder("Reply")
                .SetLabel(GetText(Resource.String.Reply))  // "Reply Label"
                .Build();
                // pendingIntent で起動する Activity
                var intent = new Intent(this, typeof(StartActionActivity));
                // Wear の Update を待つ処理
                var replyPendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent);
                // Wear でスワイプ (Extender？) した際のアクション
                var replyAction = new NotificationCompat.Action.Builder(
                    Android.Resource.Drawable.IcButtonSpeakNow,
                    GetText(Resource.String.Reply), replyPendingIntent)  // "リプライ"
                    .AddRemoteInput(remoteInput)
                    .Build();
                // Wear の Extender を構築
                var wealableExtender = new NotificationCompat.WearableExtender()
                .AddAction(replyAction);
                // Wear の Notification を構築
                var notificationBuilder = new NotificationCompat.Builder(this)
                .SetSmallIcon(Android.Resource.Drawable.IcDialogAlert)
                .SetContentTitle(GetText(Resource.String.AlertTitle))  // "アラート"
                .SetContentText(GetText(Resource.String.AlertMessage))  // "左にスワイプしてください"
                .Extend(wealableExtender);
                // Notification を送る Activity を指定
                var notificationManager = NotificationManagerCompat.From(this);
                // 実際に Notification を送る
                notificationManager.Notify(1, notificationBuilder.Build());

            };
        }
```

インテントを受け取る Activity

```csharp:StartActionActivity.cs
using Android.Support.V4.App;
...
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.StartAction);

            // Wear からの Intent を受け取る。getIntent() メソッドに相当。
            // http://www.buildinsider.net/mobile/xamarintips/0004 参照
            var intent = this.Intent;
            // RemoteInput.GetResultsFromIntent だと Android.RemoteInput と競合するのでフルで指定しています。
            // 正式な書き方は不明です。。
            var remoteInput = Android.Support.V4.App.RemoteInput.GetResultsFromIntent(intent);
            var reply = remoteInput.GetCharSequence("Reply");

            var textView = FindViewById<TextView>(Resource.Id.textView1);
            System.Diagnostics.Debug.WriteLine("{0} {1}", "User reply from wearable: ", reply);
            textView.Text = string.Format("{0} {1}", "User reply from wearable: ", reply);

        }
    }

```

Mac 不要で小さいアプリであれば Xamarin Starter でも出来そうですし、Android Wear 楽しそうですよ！？

是非 [Xamarin をダウンロード](http://www.xlsoft.com/jp/products/xamarin/xamarin_download.html?r=qiita) して触ってみてください。

## その次は

[Samples | Xamarin](http://developer.xamarin.com/samples/android/Android%20Wear/) にサンプルアプリがありますので、是非ダウンロードして触ってみてください。
[FindMyPhone | Xamarin](http://developer.xamarin.com/samples/FindMyPhoneSample/) が、Android アプリ側が Service として動作し、Wear からサービスを起動するので面白そうです。

以上です。