Android действие уведомления для обновления настроек канала уведомлений - PullRequest
0 голосов
/ 26 марта 2020

Я написал следующий метод для отправки уведомлений, уведомления работают, однако, когда нажата кнопка действия уведомления settings, ожидающее намерение настройки канала не открывается. Есть идеи, почему это не работает?

private static final String NOTIFICATION_GROUP_ID = "notification_group";
private static final int NOTIFICATION_ID = 546893;
private static final String NOTIFICATION_CHANNEL_ID = "notification_channel";

public static void sendNotification(Context context, int iconId, String title, String message, String channelId, int notificationId)
{
    NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
    NotificationChannel notificationChannel = new NotificationChannel(
            channelId, title, NotificationManager.IMPORTANCE_HIGH);

    notificationManager.createNotificationChannel(notificationChannel);

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, NOTIFICATION_ID);
    PendingIntent settingsIntent = PendingIntent.getActivity(context, 0, intent, 0);


    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
            .setSmallIcon(iconId)
            .setContentTitle(title)
            .setContentText(message)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
            .setGroup(NOTIFICATION_GROUP_ID)
            .addAction(iconId, "settings", settingsIntent)
            .setAutoCancel(true);

    notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
}

1 Ответ

0 голосов
/ 29 марта 2020

Мне удалось найти решение, но я не уверен, что это самый быстрый способ, но он работает по крайней мере.

Я обновил класс выше (NotificationUtils), изменив ожидающее намерение, которое передается кнопке действия:

Intent intent = new Intent(context, NotificationService.class);
intent.setAction(NotificationTasks.ACTION_UPDATE_NOTIFICATION_SETTINGS);
intent.putExtra("channel-id", channelId);
PendingIntent settingsIntent = PendingIntent.getService(context, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Затем я добавил класс обслуживания, который получает ожидающее намерение

public class NotificationService extends IntentService
{    
    public NotificationService() {super("NotificationIntentService");}

    @Override
    protected void onHandleIntent(@Nullable Intent intent)
    {
        NotificationTasks.executeTask(this, intent);
    }
}

, который перенаправляет запрос в класс NotificationTasks, который обрабатывает запрос, и назначает его соответствующему методу на основе Действие умысла.

public static void executeTask(Context context, Intent intent)
    {
        switch(intent.getAction())
        {
            case ACTION_UPDATE_NOTIFICATION_SETTINGS:
                updateNotificationSettings(context, intent);
                break;
        }
    }

private static void updateNotificationSettings(Context context, Intent intent)
    {
        Intent updateNotificationSettingIntent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
        updateNotificationSettingIntent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
        updateNotificationSettingIntent.putExtra(Settings.EXTRA_CHANNEL_ID, intent.getStringExtra("channel-id"));
        context.startActivity(updateNotificationSettingIntent);
    }
...