Notificationで音声入力を受け取る

2014/8/2 4262hit

ウェアラブル向けアプリを作る 目次
原文
もし、携帯端末のNotificationにemailに返信するなどのテキスト入力アクションが含まれているなら、携帯端末上でテキストを入力するために普通にActivityを起動するべきです。しかし、通知がウェアラブル上に表示されるとき、そこに入力用のキーボードはありません。そこで、RemoteInputを使用してユーザーに返信を喋らせたり予め用意されたテキストメッセージを提供することが出来ます。

ユーザーが音声、あるいは利用可能なメッセージから一つを選んだ時、システムは指定したNotificationアクションのIntentに返信テキストをつけて、携帯デバイスアプリにIntentを送ります。

メモ:Androidエミュレータは音声入力をサポートしていません。ウェアラブルデバイスのエミュレータを使用するときは、代わりにAVDでHardware keyboard presentの設定をenableにすることで返信を入力することが出来ます。

音声入力を定義する

 

音声入力をサポートするアクションを作るためにNotificationのアクションに追加することが出来るRemoteInput.Builderのインスタンスを生成します。このクラスのコンストラクターはシステムが音声入力のキーとして使用するStringを受け取ります。それはあとで携帯端末上のアプリで入力されたテキストを取り出す時に使用します。

これは音声入力プロンプトのためのカスタムラベルを提供するRemoteInputオブジェクトの作り方の例です。

// アクション Intentの中で渡されるStringのキー
private static final String EXTRA_VOICE_REPLY = "extra_voice_reply";

String replyLabel = getResources().getString(R.string.reply_label);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();

予め用意した返信テキストを加える

音声入力出来るようにするのに加えて、ユーザーが素早く返信するための最大5つの返信テキストを提供できます。setChoices()を呼んでStringのarrayを渡します。

例:resourceのarray内で複数の返信を定義する事ができます。
res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="reply_choices">
<item>Yes</item>
<item>No</item>
<item>Maybe</item>
</string-array>
</resources>

そして、Stringのarrayにinflateし、RemoteInputに加えます。

public static final EXTRA_VOICE_REPLY = "extra_voice_reply";
...
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();

Notificationアクションとして音声入力を追加する

音声入力を設定するために、addRemoteInput()を使ってアクションにRemoteInputをアタッチすると、アクションをNotificationに適用できます。
例:

// 返信アクションのためのIntentを生成する
Intent replyIntent = new Intent(this, ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(this, 0, replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT);

// 返信アクションを生成し、remote inputを追加する
NotificationCompat.Action action =
new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label, replyPendingIntent))
.addRemoteInput(remoteInput)
.build();

// notificationを作り、WearableExtenderとしてアクションを追加する
Notification notification =
new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.extend(new WearableExtender().addAction(action))
.build();

// Issue the notification
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(mContext);
notificationManager.notify(notificationId, notification);

このNotificationを発行すると、ユーザーは左にスワイプして返信アクションボタンを使用できるようになります。

音声入力をStringで受け取る

ユーザーが喋ったメッセージを返信アクションのintentで定義したActivityの中で受け取るために、getResultsFromIntent()を呼んで「返信」アクションのIntentを渡します。このメソッドは応答したテキストを含むBundleを返します。Bundleを検索すればてレスポンスを受け取ることが出来ます。
メモ:音声入力はClipDataとして記録されているため、音声の結果を得るためにIntent.getExtras()を使用してはいけません。
getResultsFromIntent()メソッドは、あなた自身でClipDataを処理する必要なくキャラクターシーケンスを受け取る便利な方法を提供します。

以下のコードはIntentを受けて音声の返信を返すメソッドを表しています、前の例で使われたEXTRA_VOICE_REPLYキーにより参照されます。

/**
* Activity.getIntent()を呼んでこのActivityを開始したIntentを取得し、
* 関連した音声入力の文字列を取得するためにこのメソッドに渡す。
*/
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(EXTRA_VOICE_REPLY);
}
}
return null;
}



Except as noted, this content is licensed under Creative Commons Attribution 2.5. For details and restrictions, see the Content License.

前:Notificationを作る 次:Notificationにページを追加する

関連キーワード

[Android][Java][モバイル][IT][翻訳][ウェアラブル]

コメントを投稿する

名前URI
コメント