LoginSignup
7
7

More than 5 years have passed since last update.

XamarinでAndroid Wearサンプルを動かしてみる

Last updated at Posted at 2014-04-14

先月末にPreview版が発表されたAndroid Wearですが、XamarinのComponent StoreにもAndroid Wear Developer Previewがありましたので、Android Studio用のプロジェクトをXamarin用に書き直してみました。

今回書き直したのはプレビュー版サンプルは WearableNotificationsSample です。ソースコードはGitHubにあります。
別サンプルのXamarin版もあります。

Android Wearの使い方を備忘録がてらメモっておきます。

Android Wear Preview APIs

Android Wearに通知するために用意されたのはクラスは次の7クラス。

APIの使い方

次にこれらのクラスの使い方をサンプルから見ていきます。

NotificationManagerCompat

機能はNotificationManagerと同じですが、使い方が若干異なります。

MainActivity.cs
// Managerの取得
var nm = NotificationManagerCompat.From(context)

// 通知の発行
nm.Notify(notification);
// 通知のキャンセル
nm.Cancel(id);

NotificationManagerCompatクラスの取得方法がSystemServiceからではなく、スタティックメソッドからになっています。

WearableNotifications with Builder

Andoid WearではJelly Beansから追加されたNotificationのスタイルが使えます。
サンプルにはそれ以外の独自のUIが2種類ありますが、どちらも既存の Notificationを拡張していきます。

Stack型

Stack

Stack型のように通知をグルーピングして表示する場合は次のようにします。

NotificationPresents.cs
// 通知をグルーピングするためのキー
var EXAMPLE_GROUP_KEY = "example";

// 1つ目の通知を作成
var childBuilder1 = new NotificationCompat.Builder(context)
        .SetContentTitle(title)
        .SetContentText(text);
var child1 = new WearableNotifications.Builder(childBuilder1)
                    .SetGroup(groupKey=EXAMPLE_GROUP_KEY, groupOrder=0)
                    .Build();
// 2つ目の通知を作成
// Actionを設定している場合、2つ目の通知を表示後、右スワイプするとアクションが行える
var childBuilder2 = new NotificationCompat.Builder(context)
        .SetContentTitle(title)
        .SetContentText(text)
        .AddAction(action);
var child2 = new WearableNotifications.Builder(childBuilder2)
        .SetGroup(groupKey=EXAMPLE_GROUP_KEY, groupOrder=1)
        .Build();

// 概要は引数のgroupOrderに WearableNotifications.GroupOrderSummary(-1) を設定
var summary = BuildBasicNotification(context, options)
        .SetGroup(EXAMPLE_GROUP_KEY, WearableNotifications.GroupOrderSummary)
        .Build();

// 後は通知する
...

Page型

Page

Page型のように左右にスワイプすることで情報を切り替える場合は次のようにします。

NotificationPresents.cs
// WearableNotifications.Builder#AddPage(Notification) 
// を呼ぶことで複数のページを追加することができる
var secondPage = new NotificationCompat.Builder(context)
        .SetContentTitle(title)
        .SetContentText(text)
        .Build();
var notification = BuildBasicNotification(context, options)
        .AddPage(secondPage)
        .Build();
// 後は通知する
...

WearableNotificationsの作成

Stack, Page型どちらの種類も共通ですが、 WearableNotifications クラスを作成する場合は WearableNotifications.Builder クラスを使用します。

var builder = new NotificationCompat.Builder(context);
var wearableBuilder = new WearableNotifications.Builder(builder)
        .SetHintHideIcon(hintHideIcon) // アイコンを表示するかどうか
        .SetLocalOnly(localOnly);       // 端末のみに通知するかどうか
        // ... その他追加処理

// NotificationCompat.Builderも取得可能
var builder2 = wearableBuilder.CompatBuilder;

Actionの設定

Android Wearから音声などの入力結果を受け取るには RemoteInput や 既存の NotificationCompat.Action クラスが使えます。
エミュレータでは音声入力ができませんが、それ以外の方法でRemoteInputの動作を確認できます。

選択肢の入力

ChoiceInput
選択肢の入力用のRemoteInputをNotificationに追加する方法は次のようになります。

ActionPresents.cs
var pendingIntent = ...;
var remoteInput = new RemoteInput.Builder(returnKey=EXTRA_REPLY)
        .SetLabel(label="Example Replay Action")
        .SetChoices(choices = new String[] {"Yes", "No", "Maybe"})
        .Build();
var action = new WearableNotifications.Action.Builder(..., intent=pendingIntent)
        .AddRemoteInput(remoteInput=remoteInput)
        .Build();
// WearableNotification.Builderに追加する
builder.AddAction(action);

音声の入力

VoiceInput
動作確認はできませんが、音声入力用のRemoteInputをNotificationに追加する方法は次のようになります。

ActionPresents.cs
var pendingIntent = ...;
var remoteInput = new RemoteInput.Builder(returnKey=EXTRA_REPLY)
        .SetLabel(label="Example Replay Action")
        .Build();
var action = new WearableNotifications.Action.Builder(..., intent=pendingIntent)
        .AddRemoteInput(remoteInput=remoteInput)
        .Build();
// WearableNotification.Builderに追加する
builder.AddAction(action);

入力値の受取方法

入力が確定すると WearableNotifications.Action.Builder のコンストラクタに指定する PendingIntent が実行されますので、受け取った Intent から入力値を取得します。

NotificationIntentReceiver.cs
// RemoteInputのコンストラクタに指定したキーを使用する
var replyMessage = intent.GetStringExtra(EXTRA_REPLY);

その他

単純にアイコンをクリックする場合は既存の NotificationCompat.Action クラスを使用します。

Big Picture example の通知を出すとエミュレータが再起動する可能性があります。
現在原因を調査中です。
  
WearableNotificationsSample を元にAndroid Wearの通知方法を簡単にまとめると以上のようになります。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7