Como utilizar o recurso Resposta direta do Android Nougat com um NotificationListener?
Meu aplicativo está usando umNotificationListener
para ler mensagens de vários aplicativos de terceiros, por exemplo, WhatsApp.
Até o momento, consegui enviar uma resposta se apenas um bate-papo não tiver sido lido, o código está abaixo.
No entanto, no caso do WhatsApp,getNotification().actions
retorna um objeto nulo quando mais de duas conversas não são lidas, pois as mensagens são agrupadas. Como você pode ver nas fotos abaixo, se as notificações forem estendidas, também existe uma opção para enviar uma resposta direta, portanto, tenho certeza de que é possível utilizá-lo, também acho que aplicativos como o PushBullet estão usando esse método.
Como eu pude acessar o RemoteInput dessa notificação?
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;
}
}
Algumas explicações sobre como o código acima funciona: Depois que uma notificação é recebida, o aplicativo tenta obter as ações e verifica se o nome está no título de remoteInput (normalmente está no formato de "Responder a $ NAME"), se for encontrado, a ação será salva em uma classe ReplyIntentSender, que, quando acionada porsendNativeIntent
, percorre todas as RemoteInputs dessa ação e adiciona a mensagem à intenção. Se mais de um bate-papo não for lido,getNotification().actions
retorna nulo.
Abaixo estão duas capturas de tela, a primeira onde está funcionando sem problemas e a segunda onde não funciona.