首页 > 代码库 > Android Wear 在可穿戴设备中使用语音进行交互
Android Wear 在可穿戴设备中使用语音进行交互
在通知中接收语音输入
如果你手机中创建了一个包括某个行为的通知,如需要回复邮件之类的操作,通常会出现一个activity让用户进行输入,但是再可穿戴设备中,没有任何键盘让用户使用,因此用户进行交互时使用的输入方式可以使用RemoteInput。
当用户使用语音回复或者可支持的其他输入方式是,系统会将文本的答复绑定在你指定的通知行为的Intent中,然后将该Intent传入手机的app。
定义语音输入
为了创建一个可以接受语音输入的行为,需要实例化RemoteInput.Builder并添加到通知的action中。它的构造方法接收一个字符串,这个字符串是系统使用语音输入的key,这样之后,就可以使用语音输入与app进行关联了。
例如,下面的代码就是创建一个RemoteInput对象,并提供语音输入功能的方法。
// Key for the string that's deliveredin the action's intent private staticfinalString 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()传递给一个字符型数组,如下是定义的一个回复的资源数组
<?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>
然后获取该数组,并添加到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();
将语音输入作为通知行为
使用addRemoteInput()将RemoteInput对象绑定到一个action中,这样你就能使用这个通知行为了,如下代码所示:
// Create an intent for the reply action Intent replyIntent = new Intent(this, ReplyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Create the reply action and add the remote input NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label, replyPendingIntent)) .addRemoteInput(remoteInput) .build(); // Build the notification and add the action via 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);
当通知弹出的时候,用户向左滑动屏幕,就可以看到reply的行为按钮。
接收语音输入作为字符串
接收用户说出的语音指令,可以调用getResultsFromIntent(),传递给Reply行为,这个方法返回一个Bundle,包含了文本的回复,然后可以查询携带回复的Bundle。这里不能用Intent.getExtras()。
下面的代码展示了接收Intent与返回语音应答的方法,在上面的代码中可以使用。
/** * Obtain the intent that started this activity by calling * Activity.getIntent() and pass it into this method to * get the associated voice input string. */ private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(EXTRA_VOICE_REPLY); } } return null; }