java - PendingIntent.getBroadcast 不适用于通知抽屉中的默认通知单击/触摸事件 - Android Studio 2.3.3 + Java

标签 java android notifications android-pendingintent broadcast

我已将通知操作处理程序与 PendingIntent.getBroadcast 连接起来,以显示通知内的操作。这些操作工作正常,当我在平视通知上使用默认单击事件时,它工作正常。当通知位于托盘中并且抽屉中有其他通知时,我的问题出现了,我试图对通知上的默认单击/触摸事件进行编程以广播到接收器并运行操作。这是一些代码:

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 方法:

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

        }

这是 list 中的接收者:

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

由于在大多数情况下通知不会在抽屉中轻松滑动,因此我需要此默认功能来反射(reflect)接受考试操作。只是我不希望它成为一个 Action ,我只是希望它在用户单击通知时起作用。我需要使用 getBroadcast,因为我正在进行 Web 服务调用(异步)来获取执行下一步所需的一些数据

最佳答案

因此,为了设置通知的默认功能,您必须在构建通知构建器之前创建默认的挂起 Intent :

像这样:

//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)

在新的NotificationCompat.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);

关于java - PendingIntent.getBroadcast 不适用于通知抽屉中的默认通知单击/触摸事件 - Android Studio 2.3.3 + Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661887/

相关文章:

objective-c - NSMenuItem 焦点/翻转通知

Android 后台堆栈不是从 Notification PendingIntent 创建的

java - 队列大小超过了在 spring boot 中使用的 ThreadPoolTask​​Executor 中配置的最大队列容量

java - 将 setText 用于 TextView 时创建的新 TextView

java - 每次调用方法时绘制矩形

android - Android 上的 Alpha 渐变

java - Android:adapter.registerDataSetObserver 与adapter.notifyDatasetChanged

email - 电子邮件通知中的 IBM RTC 日志文件

java - com.liferay.util.PwdGenerator

生成多个pdf时出现java堆空间错误