如何访问其他Android应用的通知通道?

iecba09b  于 2023-02-14  发布在  Android
关注(0)|答案(4)|浏览(154)

我想创建一个函数来调用另一个应用的通知通道设置。我不知道另一个应用的通道ID。有办法吗?

5hcedyr0

5hcedyr01#

您无法访问另一个应用的通知通道,无论是有哪些通道,还是它们的设置。
您唯一能做的就是打开另一个应用程序的通知设置概览,并指定其软件包名称(例如Facebook):

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

guicsvcw2#

这可以通过反射来实现。请注意,每个Android版本都会阻止更多的隐藏API,因此这不是一个长期的解决方案。
首先,将android.permission.STATUS_BAR_SERVICE权限添加到AndroidManifest.xml。我的IDE警告这是一个系统应用权限,但我的设备(运行小米的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

cwtwac6a

cwtwac6a3#

否,您无法处理其他应用程序通知通道,因为每个更改都有ID,没有ID系统无法获取该通道。据我所知,我们无法获取其他应用程序的通知通道ID。

bejyjqdl

bejyjqdl4#

您可以使用SDK内置的NotificationListenerService访问其他应用的通知通道,注册服务并授予通知访问权限(使用 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;
}

相关问题