Как получить доступ к каналам уведомлений для другого приложения Android?

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

4 ответа

Вы не можете получить доступ к каналам уведомлений другого приложения, ни к тем каналам, ни к их настройкам.

Единственное, что вы можете сделать, это открыть обзор настроек уведомлений другого приложения, учитывая его название пакета (например, Facebook):

Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
        .putExtra(Settings.EXTRA_APP_PACKAGE, "com.facebook.katana");
startActivity(intent);

Это можно сделать путем размышления. Обратите внимание, что с каждым выпуском Android блокируется все больше скрытых API, поэтому это не долгосрочное решение.

Сначала добавьте android.permission.STATUS_BAR_SERVICE Разрешение AndroidManifest.xml. Моя IDE предупреждает, что это разрешение системного приложения, но мое устройство (на котором работает Xiaomi MIUI 12.5, Android 11) позволяет это.

      <manifest ...>
    <uses-permission android:name="android.permission.STATUS_BAR_SERVICE"
                     tools:ignore="ProtectedPermissions"/>
    ...
</manifest>

Теперь доступны каналы любого приложения:

      // Retreive an instance of the INotificationManager service using the
// hidden NotificationManager.getService static method.
val sINM = NotificationManager::class.java.getMethod("getService").invoke(null)

// Find the INotificationManager.getNotificationChannelsForPackage method.
val getNotificationChannelsForPackageMethod =
    sINM::class.java.getMethod(
        "getNotificationChannelsForPackage",
        java.lang.String::class.java,
        Integer.TYPE,
        java.lang.Boolean.TYPE,
    )

// Retreive information about an app.
val applicationInfo = packageManager.getApplicationInfo("com.example", 0)

// Retreive a ParceledListSlice of the app's NotificationChannel objects.
// The boolean is the "includeDeleted" parameter.
val channelsSlice = getNotificationChannelsForPackageMethod.invoke(
    sINM,
    applicationInfo.packageName,
    applicationInfo.uid,
    false,
)

// Retreive the channels in the form of an ArrayList<NotificationChannel>.
val channels = channelsSlice::class.java.getMethod("getList")
    .invoke(channelsSlice) as ArrayList<NotificationChannel>

Ссылки AOSP:

NotificationManager.java

INotificationManager.aidl

BaseParceledListSlice.java

Нет, вы не можете обрабатывать другие приложения Канал уведомлений, потому что каждое изменение имеет идентификатор и без идентификатора Система не может получить этот канал. Насколько я знаю, мы не можем получить идентификаторы каналов уведомлений другого приложения.

Вы можете получить доступ к каналам уведомлений других приложений с помощью NotificationListenerService, встроенного в SDK. После регистрации службы и предоставления разрешения на доступ к уведомлениям (используя Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS") ) можно просто вызвать что-то вроде следующего метода:

      private List<NotificationChannel> getChannels() {
    final var ranking = getCurrentRanking();
    final var channelsList = new ArrayList<NotificationChannel>();

    for (var notification : getActiveNotifications()) {
        final var currentRanking = new Ranking();
        ranking.getRanking(notification.getKey(), currentRanking);
        channelsList.add(currentRanking.getChannel());
    }
    return channelsList;
}
Другие вопросы по тегам