こんにちは。エクセルソフトの田淵です。
無事 Xamarin for Visual Studio でも Android Wear アプリの開発が出来ることを確認しましたので、備忘録として残します。
必要なシステム
- Visual Studio Professional (Xamarin の対応は 2010 以上ですが最新版を使いましょうw)
- Android SDK 20 (2014/11/18 現在の最新版で大丈夫です)
- 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
エミュレーターを使用する場合は、
Hardware Keyboard present
にチェックが入っていると、Speak Now の時にキーボードで文字を入力できます。
接続済み となっていて、デモカードが動作していれば問題ありません。
実機の画面は Android Screen Monitor を使って PC に表示しています。
開発してみよう
Visual Studio を起動し、Android > Blank App (Android)
で新しいプロジェクトを作ります。
Wear は Android 4.3 以上の端末が要件ですので、プロジェクトのプロパティで Minimum Android to Target
を API 18 (v4.3) にします。
Wear 対応のアプリを開発するには Xamarin Support Library v4
が必要になりますので、 NuGet から取得します。
パッケージマネージャーから PM> Install-Package Xamarin.Android.Support.v4 -Version 20.0.0.4
としても構いません。(依存関係で Xamarin.Android.Support.v13 もインストールされる事があるようです)
後は色々見ながらコードを書いていけば大丈夫です!
ちょうど、Amazon.co.jp: 日経ソフトウエア 2014年 12月号: 日経ソフトウエア: 本 で Android Wear 特集が掲載されていたので、そのコードを Xamarin で動くように写経しました。GitHub にアップしましたので、興味があれば見てみてください。
Android/Wear_Sample at master · ytabuchi/Android
動作イメージ:
https://www.youtube.com/watch?v=sUP3RSLziKs
以下のようになりました。
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
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 をダウンロード して触ってみてください。
その次は
Samples | Xamarin にサンプルアプリがありますので、是非ダウンロードして触ってみてください。
FindMyPhone | Xamarin が、Android アプリ側が Service として動作し、Wear からサービスを起動するので面白そうです。
以上です。