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

时间:2018-06-15 18:08:23

标签: android android-notifications android-8.0-oreo notification-channel

我想创建一个调用另一个应用的通知频道设置的功能。我不知道其他应用的频道ID。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

您无法访问其他应用的通知频道,也无法访问其中的频道和设置。

您可以做的唯一事情是打开另一个应用程序的通知设置概述,给出其包名称(例如Facebook):

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

答案 1 :(得分:0)

不,您无法处理其他应用通知频道,因为每次更改都有ID且没有ID系统无法获取该频道。 根据我的知识,我们无法获得其他应用程序的通知渠道ID。

答案 2 :(得分:0)

这可以通过反射来完成。请注意,每个 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