假如手持设备的通知上包含文字输入的功能,例如回复邮件,正常情况下手持设备上会启动一个Activity来输入文字。然而,当通知显示在穿戴设备上时,没有键盘输入,你可以使用RemoteInput让用户口述回复,或者使用提供预定义的文本消息回复。当用户以声音,或者预定义的文本信息作为回答,系统会将答复添加进通知的Intent中,然后在手持设备上打开Intent对应的组件。
创建支持语音输入的RemoteInput.Builder对象添加到通知中,这个类的构造器需要传递一个字符串作为作为语音输入的key,稍后用于检出输入的文字。除允许声音输入外,可以提供5个预定义的文本消息,让用户选择以快速回复。
代码如下:
private static final String EXTRA_VOICE_REPLY =
"extra_voice_reply";
String[] choices = {"吃过了", "还没吃", "你请我啊", "我要吃麻辣烫"};
//EXTRA_VOICE_REPLY 为检出语音输入文本的Key
RemoteInput input = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel("吃饭了么?") //设置 提问
.setChoices(choices) //设置 预定义文本作为快速回复
.build();
设置语音输入,可以使用addRemoteInput()方法添加RemoteInput对象到Action,让通知支持语音回复。
代码如下:
//创建Intent,用于接收回复
Intent actionIntent = new Intent();
i.setClass(this, ReplayActivity.class);
PendingIntent actionPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
//创建Action
NotificationCompat.Action actionRemoteInput = new
NotificationCompat.Action.Builder(R.drawable.background,
"语音回复", actionPendingIntent)
.addRemoteInput(input).build();
//添加Action到通知
builder.extend(new NotificationCompat.WearableExtender()
.setBackground(BitmapFactory.decodeResource(getResources() , R.drawable.background))
.addAction(actionRemoteInput));
在回复意图所对应的Activity中接收用户回复,调用getResultsFromIntent()方法,把含有回复内容的Intent传过去,这个方法的返回值是包含回复信息的Bundle对象,根据之前设置的语音输入文本的Key就可以取出所对应的文本内容。
代码如下:
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput =
RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(EXTRA_VOICE_REPLY);
}
return null;
}
运行效果如下图所示,最开始语音回复,说完语音后,系统会自动语音识别成字符串。或者也可可以选择预先定义好的文本,作为答复。当答复后,系统会显示“Sending”界面,让用户有时间来取消之前的选择。如果“Sending”界面进度完成后,系统会打开Action所对应的Intent,从该Activity的Intent中取出答复的文本。
语音输入的通知
注意:模拟器不支持语音输入,只能键盘输入。所以这个案例的语音功能只能在真机上测试。