美文网首页程序员Android开发Android知识
接收通知中的语音输入(Receiving Voice Input

接收通知中的语音输入(Receiving Voice Input

作者: lucky9322 | 来源:发表于2016-10-27 15:34 被阅读65次

    接收通知的语音输入

    如果手机上的通知包含输入文本的操作,比如回复email那么通常是启动一个页面输入文本.但是在穿戴设备wear上,没有键盘输入所以只能使用RemoteInput这个类完成让使用者指定回复或者回复预定义的文本信息.

    当用户使用语音或者选择一个预定义消息回复时,系统会将回复内容信息绑定到为通知创建的Intent上,并且发送到手机app上.

    注意:android模拟器不支持语音输入,当使用wear的模拟器时,需要启用AVD设置中的显示硬件键盘,代替语音回复.

    定义语音输入


    首先创建RemoteInput.Builder然后为通知添加语音输入行为.这个类的构造方法接收一个字符串,这个字符串做为输入语音内容的key,在之后获取语音输入内容时需要使用这个key.

    举个例子,展示如何创建一个RemoteInput对象.

    // Key for the string that's delivered in the action's intent
    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();
    

    添加与定义的回复文本

    除了允许添加语音输入,你也可以提供与定义的文本回复最多五个.用户可以选择用来快速回复.通过调用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 String 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对象上去设置语音输入.可以将这个行为应用到通知上.举个栗子:

    // 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);
    

    当展示这个通知的时候,用户可以向左滑动看到回复的行为按钮.

    获取语音输入做为一个字符串

    为了在你定义的页面中收到用户发送传递的消息里的intent,通过调用getResultsFromIntent()这个方法获得回复消息里的intent.这个方法返回一个包含回复文本内容的Bundle,你可以查询获得这个Bundle中的回复.

    注意:不要使用Intent.getExtras()去获取语音输入的东西,因为语音输入内容被做为ClipData来存储.而方法getResultsFromIntent()提供了一个便利的方式去获取收到的字符串避免了你自己处理ClipData数据的过程.

    下面的代码展示获取intent和语音内容的方式,这里引用到了上面代码片段中的EXTRA_VOICE_REPLY做为key.

    /**
     * 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;
    }
    

    相关文章

      网友评论

        本文标题:接收通知中的语音输入(Receiving Voice Input

        本文链接:https://www.haomeiwen.com/subject/juqsuttx.html