安卓 - 推送通知已开启?

13
如何在程序中检查用户是否在应用设置中关闭了推送通知?我能否直接从应用程序打开应用程序设置意图以提示用户打开它?谢谢。

据我所知,您无法关闭这些通知。如果您查看NotificationNotificationManager,您将看不到任何允许获取该信息的方法。不过,我的说法可能是错误的。 - Akatosh
也许 https://dev59.com/_G855IYBdhLWcg3wUCWC 可以帮到你。 - OcuS
那么,如果您不想再收到有关该应用的新推送消息,您需要卸载该应用程序,这是正确的吗? - vikingsteve
2个回答

8
假设您是在参考Google Cloud Messaging(因为您使用了android和push-notification标签),则没有通用设置可用于启用/禁用GCM服务(不像适用于iOS设备的Apple Push Notification服务)。
当您安装应用程序时,如果该应用程序使用Google Cloud Messaging,则它将列在此应用程序所需权限列表中。通过选择安装应用程序,您允许其向您发送推送通知。
也就是说,为了使应用程序实际接收到GCM消息,您的应用程序必须以编程方式注册到GCM服务。您可以在应用程序中任何地方执行此操作,并且您可以创建一个“应用设置”活动(或片段或其他任何内容),其中用户可以启用/禁用GCM(这将触发对/从GCM的注册/取消注册)。您的应用程序可以包含一个持久存储器,用于保存注册到GCM时收到的注册ID,并且您可以使用该存储器来确定您的应用程序是否已注册到GCM。
如果应用程序已经运行,您可以要求用户将其打开(如果您有一些代码可以实现这一点)。如果它未运行并且该应用程序未在该设备上注册为GCM,则您的服务器无法向其发送GCM消息。
如果您想克服此障碍,可以自动注册到GCM(当首次启动应用程序时)。然后,您可以随时向应用程序发送消息。如果您仍然希望让用户决定是否要查看这些通知,则可以在应用程序设置中设置标志,以启用/禁用作为收到GCM消息的结果创建的UI通知。 GCM服务将始终处于启用状态,但除非用户选择查看通知,否则当GCM消息到达时,您的应用程序不会显示任何内容。

2
如果我理解正确的话,“应用程序设置中显示通知”只是为了隐藏应用程序中的所有“弹出窗口”?例如,我仍然可以接收通知,将它们存储并在用户进入应用时显示为对话框。 - goodm
@goodm 我不确定你指的是哪些“应用程序设置”。你是指特定应用程序内的特定“应用程序设置”吗?如果你是指从GCM服务接收到的通知,那么如何编写你的应用程序就取决于你(是否自动注册到GCM并始终保持注册状态,这将允许你始终接收通知)。 - Eran
通过应用程序设置,我指的是设置->应用程序管理器->应用程序信息,有一个名为“显示通知”的小“勾选”选项。 - goodm
@goodm 你使用的是哪个设备/Android版本?我在我的相对较旧的Android设备上没有它。 - Eran
@ goodm 很抱歉,我的S版本是2.2,我没有那个复选框,所以我不知道它的存在。我以为你在指特定应用程序中的某些设置。 - Eran

3

除非声明系统进程或具有root权限,否则无法访问此属性。首先,您可以查看文件的权限:/data/system/notifycaiton_policy.xml: -wr------。

另一种方法是查看源代码:/android/4.2/frameworks/base/services/java/com/android/server/NotificationManagerService.java。 在api中:public void setNotificationsEnabledForPackage(String pkg, boolean enabled),将检查调用者的UID是否为Process.SYSTEM_UID

void checkCallerIsSystem() {
    int uid = Binder.getCallingUid();
    if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
        return;
    }
    throw new SecurityException("Disallowed call for uid " + uid);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接