1

私はPendingIntent.getBroadcastで通知アクションハンドラーを通知しています。アクションはうまくいきます。頭の上でデフォルトのクリックイベントを使用すると、正常に動作します。私の問題は、通知がトレイにあり、引き出しに他の通知があるときです。通知のデフォルトのクリック/タッチイベントをプログラムして、受信者にブロードキャストしてアクションを実行しようとしています。マニフェスト内の受信機、ここでPendingIntent.getBroadcastは、通知ドロワーのデフォルトの通知のクリック/タッチイベントでは機能していません - Android Studio 2.3.3 + Java

private Context context; 

    @Override 
    public void onReceive(Context ctx, final Intent intent) { 
     Log.d("PushNotificationActions","Started"); 
     String action = intent.getAction(); 
     Log.d("<-------------------<<<", "getaction is: " + action); 
     context = ctx; 
     if (ACCEPT_EXAM.equals(action)) { 
      Log.d("ACCEPT_ACTION", "READY FOR EXAM NOW"); 
      Map<String, String> params = new HashMap(); 
      params.put("email", email); 
      final JSONObject parameters = new JSONObject(params); 
      Log.d("parameters: ", parameters.toString()); 
      volleyJsonObjectPost("ws", parameters, new Login.ServerCallback() { 
       public void onSuccess(JSONObject response) { 
        try { 
         final JSONObject loginData = response.getJSONObject("d"); 

         DataModel.sharedInstance().key = loginData.getString("key"); 
         final String visitLink; String link; final String visitId; Bundle extras = intent.getExtras(); 
         if(extras != null) { 
          link = extras.getString("link"); 
          visitId = extras.getString("visitId"); 
          visitLink = link + loginData.getString("key") + ',' + visitId; 

          JSONObject params = new JSONObject(); 
          params.put("key", loginData.getString("key")); 
          Log.d("params: ", params.toString()); 
          volleyJsonObjectPost("ws", params, new Login.ServerCallback() { 
           public void onSuccess(JSONObject result) { 
            try { 
             final JSONObject acceptExamResultData = result.getJSONObject("d"); 
             Log.d("acceptExamResultData: ", acceptExamResultData.toString()); 


             if (acceptExamResultData.getBoolean("status") == true) { 
              Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse(visitLink)); 
              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
              intent.setPackage("com.android.chrome"); 
              try { 
               context.startActivity(intent); 
               NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
               mNotificationManager.cancel(Integer.parseInt(visitId)); 
              } catch (ActivityNotFoundException ex) { 
               // Chrome browser presumably not installed so allow user to choose instead 
               intent.setPackage(null); 
               context.startActivity(intent); 
               NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
               mNotificationManager.cancel(Integer.parseInt(visitId)); 
               Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
               context.sendBroadcast(closeIntent); 
              } 
             }else { 
              // Exam was already accepted by another Doc 
             } 



            } catch (JSONException e) { 
             e.printStackTrace(); 
            } 
           } 
          }); 


         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

     }else if (DISMISS_EXAM.equals(action)) { 
      Log.d("DISMISS_ACTION", "I CANNOT TAKE THIS EXAM"); 
      String visitId; Bundle extras = intent.getExtras(); 
      if(extras != null) { 
       visitId = extras.getString("visitId"); 
       NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
       Log.d("Visit ID to cancel", visitId); 
       mNotificationManager.cancel(Integer.parseInt(visitId)); 
       Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
       context.sendBroadcast(closeIntent); 
      } 

     } 

れる:

<receiver android:name=".PushNotificationActions" > 
      <intent-filter> 
       <action android:name="com.Telemed.app.ACCEPT_EXAM" /> 
       <action android:name="com.Telemed.app.DISMISS_EXAM" /> 
      </intent-filter> 
     </receiver> 

する通知で容易にスライドしないのでここでは

Uri alertSound = Uri.parse("android.resource://" + ctx.getPackageName() + "/raw/page_the_doctor"); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx) 
      .setAutoCancel(true) 
      .setSmallIcon(R.mipmap.telemed_logo) 
      .setContentTitle("PATIENT READY") 
      .setContentText(notification) 
      .setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS) 
      .setSound(alertSound) 
      .setPriority(Notification.PRIORITY_MAX) 
      .setAutoCancel(true); 

     //CLICK ON NOTIFICATION HERE ONLY WORKS ON HEADS UP AND NOT DEFAULT 
     Intent notificationIntent = new Intent(ctx, PushNotificationActions.class); 
     notificationIntent.putExtra("visitId", visitId); 
     notificationIntent.putExtra("link", link); 
     notificationIntent.setAction(ACCEPT_EXAM); 
     notificationIntent = notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent clickIntent = PendingIntent.getBroadcast(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     notificationBuilder.setContentIntent(clickIntent); 

     //Accept intent action works fine 
     Intent acceptExam = new Intent(ctx, PushNotificationActions.class); 
     acceptExam.setAction(ACCEPT_EXAM); 
     acceptExam.putExtra("visitId", visitId); 
     acceptExam.putExtra("link", link); 
     PendingIntent pendingAcceptIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), acceptExam, PendingIntent.FLAG_UPDATE_CURRENT); 
     notificationBuilder.addAction(R.drawable.accept_action_24dp, "ACCEPT", pendingAcceptIntent); 

     //Dismiss intent action works fine 
     Intent dismissExam = new Intent(ctx, PushNotificationActions.class); 
     dismissExam.setAction(DISMISS_EXAM); 
     dismissExam.putExtra("visitId", visitId); 
     dismissExam.putExtra("link", link); 
     PendingIntent pendingDismissIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), dismissExam, PendingIntent.FLAG_UPDATE_CURRENT); 
     notificationBuilder.addAction(R.drawable.dismiss_action_24dp, "DISMISS", pendingDismissIntent); 

     Notification noti = notificationBuilder.build(); 
     noti.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; 

     NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(Integer.parseInt(visitId), noti); 

onReceive方法であって、ここでいくつかのコードであります引き出しほとんどの場合、私はこのデフォルトの機能が受験拒否行動を反映するために必要です。私はそれをアクションにしたくないだけです。ユーザーが通知をクリックしたときに機能するようにしてください。私は次のステップを行うために必要なデータを得るためにWebサービス呼び出し(非同期)を行っているのでgetBroadcastを使用する必要があります

答えて

2

したがって、通知のデフォルト機能を設定するには、デフォルトの保留中のインテントこれと同様

//CLICK ON NOTIFICATION 
     Intent notificationIntent = new Intent(ctx, PushNotificationActions.class).setAction(ACCEPT_EXAM).putExtra("visitId", visitId).putExtra("link", link); 
     PendingIntent clickIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

そのセットした後、この新しい通知で

.setContentIntent(clickIntent) 

をご通知ビルダーを構築する前に、 Compat.Builder。その後、必要な数のアクションを設定することができますが、デフォルトでは引き続きアクションにアクセスし、引き出しが通知を通知先に貼り付ける場合にデフォルトとして機能し、プログラムされたアクションは表示されません。

Uri alertSound = Uri.parse("android.resource://" + ctx.getPackageName() + "/raw/page_the_doctor"); 

     //CLICK ON NOTIFICATION 
     Intent notificationIntent = new Intent(ctx, PushNotificationActions.class).setAction(ACCEPT_EXAM).putExtra("visitId", visitId).putExtra("link", link); 
     PendingIntent clickIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx) 
       .setAutoCancel(true) 
       .setSmallIcon(R.mipmap.telemed_logo) 
       .setContentTitle("TELEMED PATIENT READY") 
       .setContentText(notification) 
       .setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS) 
       .setSound(alertSound) 
       .setPriority(Notification.PRIORITY_MAX) 
       .setContentIntent(clickIntent) 
       .setAutoCancel(true); 

     //Accept intent 
     Intent acceptExam = new Intent(ctx, PushNotificationActions.class).setAction(ACCEPT_EXAM).putExtra("visitId", visitId).putExtra("link", link); 
     PendingIntent pendingAcceptIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), acceptExam, PendingIntent.FLAG_UPDATE_CURRENT); 
     notificationBuilder.addAction(R.drawable.accept_action_24dp, "ACCEPT", pendingAcceptIntent); 

     //Dismiss intent 
     Intent dismissExam = new Intent(ctx, PushNotificationActions.class).setAction(DISMISS_EXAM).putExtra("visitId", visitId).putExtra("link", link); 
     PendingIntent pendingDismissIntent = PendingIntent.getBroadcast(ctx, Integer.parseInt(visitId), dismissExam, PendingIntent.FLAG_UPDATE_CURRENT); 
     notificationBuilder.addAction(R.drawable.dismiss_action_24dp, "DISMISS", pendingDismissIntent); 

     Notification noti = notificationBuilder.build(); 
     noti.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; 

     NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(Integer.parseInt(visitId), noti); 
関連する問題