13

私のアプリでは、NotificationListenerを使って、さまざまなサードパーティのアプリからのメッセージ(例えば、WhatsApp)を読み上げています。Android Nougatの直接リプライ機能をNotificationListenerと併用するにはどうすればよいですか?

これまでのところ、1つのチャットしか未読の場合は返信することができました。コードは以下のとおりです。

しかし、WhatsAppの場合、メッセージは一緒にバンドルされるので、2つ以上のチャットが未読の場合、getNotification().actionsはヌルオブジェクトを返します。下の図にあるように、通知が延長されている場合は、直接返信するオプションもありますので、これを利用することができると確信しています。また、PushBulletのようなアプリはこのメソッドを使用しています。

通知のRemoteInputにはどうすればアクセスできますか?

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

上記のコードがどのように機能するかをいくつか説明:通知を受信すると名前がremoteInputのタイトルにある場合、アプリはアクションと小切手を取得しようとします(通常は、それは返信」の形式であります$ NAME ")が見つかった場合、アクションはReplyIntentSenderクラスに保存されます。このクラスは、sendNativeIntentによってトリガーされると、そのアクションのすべてのRemoteInputを循環し、そのメッセージをインテントに追加します。複数のチャットが未読の場合、getNotification().actionsはnullを返します。

以下は2つのスクリーンショットです。最初のスクリーンショットは問題なく動作し、2番目は問題のないスクリーンショットです。

I can reply to this message

I cannot reply to this message

+0

NotificationListenerServiceまたはカスタムNotificationListenerインターフェイスを使用していますか? –

+0

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

+0

@PravinDivraniya私は通常のNotificationListenerServiceを使用しています。 – Force

答えて

1

あなたは私の提案としてこれを考慮することができます。私はこれに関する少しの研究をして、結論を出しています(これについて多くの研究をしたので、私が以下に書いたことを知っている可能性があります)。

Android Wearデバイスからアクセスできるアクションが含まれています。デバイス上のWear通知を取得し、アクションを抽出し、応答アクション(存在する場合)を見つけ、それを自分のレスポンスで入力してからPendingIntentを実行すると、応答を元のアプリケーションに戻して送信します受信者。

this link(Rob Jの素晴らしい回避策)を参照してください。また、このコンテキスト(のMichałTajchertによって行わ偉大な研究活動)にthis linkを参照することができます。(あなたがNotificationCompat.isGroupSummaryを回避する必要がある場合があります)

これは私が(私は完全に間違っている場合がございます)感じるものです

.actions方法は、ここでaddAction方法は、それが意図したとおりに機能しない場合があります 1に廃止されて、addAction(int, CharSequence, PendingIntent)によって現在の通知に接続されているすべてのNotification.Action 構造体の配列を返します。

私はこれを私の最後にテストすることはできません。それ以外の場合は、コードを使った解決策を提供したいと思います。

希望すると、これが役立ちます。ハッピーコーディング!!!

+0

ありがとう、私は最初のリンクの '.isGroupSummary'部分についてちょっと混乱しています - 私は彼がGroupSummariesを処理していないのですか? – Force

+0

これは、一度にアプリから投稿された複数の通知を識別するために使用されます。 .isGroupSummaryを使用した最初のリンクでは、着用通知を識別し、それをつかんでアクションとリモート入力を抽出して返信します。 –

+0

@Forceこの回答がお役に立てば幸いです。 –

関連する問題