¿Cómo utilizar la función de respuesta directa de Android Nougat con NotificationListener?
Mi aplicación está usando unNotificationListener
para leer mensajes de varias aplicaciones de terceros, por ejemplo, WhatsApp.
Hasta ahora pude enviar una respuesta si solo un chat no está leído, el código está debajo.
Sin embargo, en el caso de WhatsApp,getNotification().actions
devuelve un objeto nulo cuando no se leen más de dos chats, ya que los mensajes se agrupan. Como puede ver en las imágenes a continuación, si las notificaciones se extienden, también existe la opción de enviar una respuesta directa, por lo tanto, estoy seguro de que es posible utilizar esto, también creo que aplicaciones como PushBullet están utilizando este método.
¿Cómo puedo acceder a RemoteInput de esa notificación?
public static ReplyIntentSender sendReply(StatusBarNotification statusBarNotification, String name) {
Notification.Action actions[] = statusBarNotification.getNotification().actions;
for (Notification.Action act : actions) {
if (act != null && act.getRemoteInputs() != null) {
if (act.title.toString().contains(name)) {
if (act.getRemoteInputs() != null)
return new ReplyIntentSender(act);
}
}
}
return null;
}
public static class ReplyIntentSender {
[...]
public final Notification.Action action;
public ReplyIntentSender(Notification.Action extractedAction) {
action = extractedAction;
[...]
}
private boolean sendNativeIntent(Context context, String message) {
for (android.app.RemoteInput rem : action.getRemoteInputs()) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putCharSequence(rem.getResultKey(), message);
android.app.RemoteInput.addResultsToIntent(action.getRemoteInputs(), intent, bundle);
try {
action.actionIntent.send(context, 0, intent);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
}
Alguna explicación de cómo funciona el código anterior: una vez que se recibe una notificación, la aplicación intenta obtener las acciones y comprueba si el nombre está en el título de una entrada remota (normalmente está en el formato de "Responder a $ NAME"), si eso se encuentra que la acción se guarda en una clase ReplyIntentSender que, cuando es activada porsendNativeIntent
, recorre todos los RemoteInputs de esa Acción y agrega el mensaje a la intención. Si no se lee más de un chat,getNotification().actions
devuelve nulo
A continuación hay dos capturas de pantalla, la primera donde funciona sin problemas y la segunda donde no funciona.