13

Moja aplikacja używa numeru NotificationListener do odczytywania wiadomości z różnych aplikacji innych firm, na przykład WhatsApp.Jak wykorzystać funkcję bezpośredniej odpowiedzi Android Nougat za pomocą Powiadomienia?

Do tej pory udało mi się wysłać odpowiedź, jeśli tylko jeden czat jest nieprzeczytany, kod znajduje się poniżej.

Jednak w przypadku WhatsApp, getNotification().actions zwraca obiekt zerowy, gdy więcej niż dwa czaty są nieprzeczytane, ponieważ wiadomości są grupowane razem. Jak widać na poniższych zdjęciach, jeśli powiadomienia zostaną przedłużone, istnieje możliwość wysłania bezpośredniej odpowiedzi, dlatego jestem pewien, że można to wykorzystać, również uważam, że aplikacje takie jak PushBullet używają tej metody.

W jaki sposób mogę uzyskać dostęp do zdalnego adresu tego powiadomienia?

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

jakieś wytłumaczenie jak powyższy kod działa: Po otrzymaniu powiadomienia aplikacja próbuje dostać działania i sprawdza, czy nazwa jest w tytule remoteInput (zazwyczaj jest w formacie „Odpowiedz $ NAME "), jeśli tak się stanie, Akcja zostanie zapisana w klasie ReplyIntentSender, która po wywołaniu przez sendNativeIntent przejdzie przez wszystkie RemoteInputs tej Akcji i doda komunikat do intencji. Jeśli więcej niż jeden czat jest nieprzeczytany, getNotification().actions zwraca wartość null.

Poniżej znajdują się dwa zrzuty ekranu, pierwszy, w którym działa bez żadnych problemów, a drugi, w którym nie działa.

I can reply to this message

I cannot reply to this message

+0

Czy używasz usługi NotificationListenerService lub niestandardowego interfejsu NotificationListener? –

+0

przeczytaj: https://developer.android.com/reference/android/service/notification/NotificationListenerService.html – CristiC777

+0

@PravinDivraniya Używam zwykłej usługi NotificationListenerService. – Force

Odpowiedz

1

Można uznać to za moją sugestią. Zrobiłem trochę badań na ten temat i przedstawiłem następujące wnioski. (Wygląda na to, że wykonałeś wiele badań na ten temat, więc być może wiesz, co napisałem poniżej)

Liczne aplikacje wysłane powiadomienia, a wiele z nich zawiera czynności dostępne z urządzenia Android Wear. Możemy pobrać powiadomienia o zużyciu na urządzeniu, wyodrębnić czynności, znaleźć odpowiedź (jeśli istnieje), wypełnić ją naszą własną odpowiedzią, a następnie wykonać PendingIntent, która wysyła naszą odpowiedź z powrotem do oryginalnej aplikacji, aby wysłać ją do odbiorca.

W tym celu można odnieść się do: this link (Ładne rozwiązanie problemu Rob J). Można również zapoznać this link w tym kontekście (Wielka prac badawczych prowadzonych przez Michał Tajchert). (Być może trzeba obejść z NotificationCompat.isGroupSummary)

To co czuję (może być Jestem całkowicie niewłaściwy)

.actions metoda zwraca tablicę wszystkich Notification.Action struktur dołączonych do obecnego zgłoszenia przez addAction(int, CharSequence, PendingIntent), Oto metoda Addaction jest przestarzała jedną więc nie może pracować zgodnie z przeznaczeniem.

Nie jestem w stanie przetestować tego na moim końcu, w przeciwnym razie z przyjemnością przedstawię działające rozwiązanie z kodem.

Mam nadzieję, że to ci pomoże. Happy Coding !!!

+0

Dziękuję za twój wkład, jestem nieco zakłopotany częścią ".isGroupSummary" pierwszego linku - czy mam rację, że nie przetwarza GroupSummaries? – Force

+0

Służy do identyfikacji wielu powiadomień wysłanych przez aplikację na raz. W pierwszym łączu z użyciem .isGroupSummary identyfikuje powiadomienie o zużyciu, chwyć go i wyciągnij z niego działania oraz zdalne wprowadzanie danych i wysyła odpowiedź. –

+0

@Force Mam nadzieję, że ta odpowiedź ci pomoże. –

Powiązane problemy