android android-7.0-nougat notification-listener remote-input

¿Cómo utilizar la función de respuesta directa de Android Nougat con un NotificationListener?



android-7.0-nougat notification-listener (1)

Puedes considerar esto como mi sugerencia. He investigado un poco sobre esto y he llegado a las siguientes conclusiones (también parece que has investigado bastante sobre esto, por lo que es posible que te des cuenta de lo que escribí a continuación)

Numerosas aplicaciones envían notificaciones específicas de Wear, y muchas de ellas contienen acciones accesibles desde un dispositivo Android Wear. Podemos tomar esas notificaciones de Desgaste en el dispositivo, extraer las acciones, encontrar la acción de respuesta (si existe), PendingIntent con nuestra propia respuesta y luego ejecutar el PendingIntent que envía nuestra respuesta de vuelta a la aplicación original para que la envíe al recipiente.

Para hacerlo, puede consultar este enlace (una buena solución por Rob J). También puede consultar este enlace en este contexto (Gran trabajo de investigación realizado por Michał Tajchert). (Es posible que tenga que trabajar con NotificationCompat.isGroupSummary )

Esto es lo que siento (puede ser que estoy totalmente equivocado)

.actions método .actions devuelve una matriz de todas las estructuras Notification.Action adjuntas a la notificación actual mediante addAction (int, CharSequence, PendingIntent) . Aquí el método addAction está en desuso, por lo que es posible que no funcione correctamente.

No puedo probar esto al final, de lo contrario me encantaría proporcionar una solución de trabajo con código.

Espero que esto te ayudará. Feliz codificacion !!!

Mi aplicación está utilizando un NotificationListener para leer los mensajes de varias aplicaciones de terceros, por ejemplo, WhatsApp.

Hasta ahora he podido enviar una respuesta si solo un chat no se ha leído, el código está debajo.

Sin embargo, en el caso de WhatsApp, las getNotification().actions Devuelven un objeto nulo cuando no se getNotification().actions 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, y creo que aplicaciones como PushBullet están usando este método.

¿Cómo puedo acceder a la entrada remota 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 verifica si el nombre está en el título de una entrada remota (normalmente tiene el formato "Responder a $ NOMBRE"), si es que se encuentra que la Acción se guarda en una clase ReplyIntentSender, que, cuando se desencadena con sendNativeIntent , recorre todos los RemoteInputs de esa Acción y agrega el mensaje a la intención. Si no se ha leído más de un chat, getNotification().actions devuelve un valor nulo.

A continuación se muestran dos capturas de pantalla, la primera donde funciona sin problemas y la segunda donde no funciona.