読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin for Visual Studio で Android Wear 開発

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

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

必要なシステム

  • Visual Studio Professional (Xamarin の対応は 2010 以上ですが最新版を使いましょうw)
  • Android SDK 20 (2014/11/18 現在の最新版で大丈夫です) AndroidSDK20.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 アプリを動かす - Xamarin 日本語情報

エミュレーターを使用する場合は、Hardware Keyboard present にチェックが入っていると、Speak Now の時にキーボードで文字を入力できます。 スクリーンショット 2014-11-18 14.47.53.png

接続済み となっていて、デモカードが動作していれば問題ありません。 スクリーンショット 2014-11-18 14.15.31.png

実機の画面は Android Screen Monitor を使って PC に表示しています。

開発してみよう

Visual Studio を起動し、Android > Blank App (Android) で新しいプロジェクトを作ります。 スクリーンショット 2014-11-17 20.55.33.png

Wear への接続は Android 4.3 以上の端末が要件ですので、プロジェクトのプロパティで Minimum Android to TargetAPI 18 (v4.3) にします。 スクリーンショット 2014-11-18 14.19.49.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

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

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

Android/Wear_Sample at master · ytabuchi/Android

動作イメージ:


Visual Studio で Android Wear アプリ開発 - YouTube

コードは以下です。

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

            };
        }

インテントを受け取る StartActionActivity

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 不要ですし Android Wear 楽しそうですよ!?

是非 Xamarin をダウンロード して触ってみてください。

その次は

Samples | Xamarin にサンプルアプリがありますので、是非ダウンロードして触ってみてください。
FindMyPhone | Xamarin が、Android アプリ側が Service として動作し、Wear からサービスをキックするので面白そうです。

以上です。