Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Android Wear: Отвечаем на уведомления голосом или жестами

После того, как мы научились посылать уведомления на часы, настало время научиться отвечать на поступающие уведомления.

На эмуляторе голосовой ввод не доступен, поэтому в настройках эмулятора следует ввести поддержку клавиатурного ввода, чтобы имитировать ответ голосом. У меня не получилось, поэтому проверял на реальных часах.

Некоторые тип уведомлений предполагают реакцию пользователя, например, ответить на письмо. Так как на часах есть клавиатуры, то вы можете предложить пользователю ответить голосом или выбрать заранее подготовленные текстовые сообщения.

В этом случае голосовой ответ пользователя или выбранное текстовое сообщение будет прикреплено к заданному Intent для отправки в ваше приложение.

Для реализации поддержки ответа голосом нужно создать экземпляр объекта RemoteInput.Builder, который добавляется к уведомлению. В конструкторе нужно указать строку, по которой система будет узнавать, что голосовой ввод предназначен для вашей программы.

Также вы можете указать не более пяти готовых текстовых сообщений, которые пользователь может выбрать для быстрого ответа. Ответы можно подготовить в строчном массиве в ресурсах и присоединить к намерению через метод setChoices().

В файле strings.xml добавим массив.


<string-array name="reply_choices">
    <item>Пушкин</item>
    <item>Кукушкин</item>
    <item>Ой, всё</item>
</string-array>

Добавим в активность кнопку и напишем пример создания уведомления, на который можно ответить.


package ru.alexanderklimov.weardemo;

import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.RemoteInput;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    // Строка для намерения ответа
    public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view) {

        int notificationId = 001;

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

        // Create an intent for the reply action
        Intent replyIntent = new Intent(this, NotificationActivity.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_launcher,
                        getString(R.string.label), replyPendingIntent)
                        .addRemoteInput(remoteInput)
                        .build();

        // Build the notification and add the action via WearableExtender
        Notification notification =
                new NotificationCompat.Builder(MainActivity.this)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle("Важное сообщение")
                        .setContentText("А кота кто кормить будет?")
                        .extend(new NotificationCompat.WearableExtender().addAction(action))
                        .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 })
                        .build();

        // Issue the notification
        NotificationManagerCompat notificationManager =
                NotificationManagerCompat.from(MainActivity.this);
        notificationManager.notify(notificationId, notification);
    }
}

Для приёма ответа создадим вторую активность NotificationActivity с текстовой меткой и добавим код.


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification);

    Intent intent = getIntent();

    TextView replyTextView = (TextView) findViewById(R.id.textViewReply);
    replyTextView.setText(getMessageText(intent));
}

Проверяем. Запускаем пример и нажимаем на кнопку. На часах появляется уведомление.

На круглых часа сообщение обрезается, чуть подвинем его вверх.

Теперь понятно. Делаем свайп влево и попадаем на экран ответа.

Нажимаем на значок и говорим (или выбираем готовый вариант из списка)

Выбранный вариант обрабатывается и посылается в наше приложение.

На телефоне запускается вторая активность с выбранным текстом.

Реклама