Android - 推送通知已开启?

Posted

技术标签:

【中文标题】Android - 推送通知已开启?【英文标题】:Android - Push Notification are ON? 【发布时间】:2013-05-30 13:00:16 【问题描述】:

如果用户在应用设置中关闭推送通知,如何以编程方式检查? 我可以直接从应用打开应用设置 Intent 以提示用户开启吗?

谢谢

【问题讨论】:

据我所知,您无法关闭这些通知。如果您检查Notification 和NotificationManager,您将看不到任何允许获取该信息的方法。不过我可能是错的。 也许***.com/questions/4421527/… 会有所帮助。 如果您不想收到关于它的新推送消息,那么您需要卸载该应用程序是否正确? android 4.1: How to check notifications are disabled for the application?的可能重复 【参考方案1】:

假设您指的是 Google Cloud Messaging(因为您使用的是 android 和 push-notification 标签),则没有用于启用/禁用 GCM 服务的常规设置(与 ios 设备的 Apple Push Notifications 服务不同)。

当您安装应用程序时,如果该应用程序使用 Google Cloud Messaging,它将列在该应用程序运行所需的权限列表中。通过选择安装应用程序,您允许它向您发送推送通知。

也就是说,为了让应用真正接收 GCM 消息,您的应用必须以编程方式注册到 GCM 服务。您可以在应用程序中的任何位置执行此操作,并且您可以创建一个app settings 活动(或片段或其他),用户可以在其中启用/禁用 GCM(这将触发向/从 GCM 注册/注销)。您的应用可以包含一个持久存储,该存储将保存您在注册到 GCM 时收到的注册 ID,您可以使用该存储来确定您的应用是否已注册到 GCM。

如果应用程序已经在运行(如果您有一些代码可以做到这一点),您可以要求您的用户打开它。如果它没有运行并且应用程序没有在该设备上注册 GCM,则您的服务器无法向它发送 GCM 消息。

如果您想克服这个障碍,您可以自动注册到 GCM(当应用首次启动时)。然后,您可以随时向应用程序发送消息。如果您仍想让用户决定是否要查看这些通知,您可以在应用设置中设置一个标志,以启用/禁用您作为传入 GCM 消息创建的 UI 通知。 GCM 服务将始终启用,但除非用户选择查看通知,否则当 GCM 消息到达时,您的应用不会显示任何内容。

【讨论】:

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

除非你声明了系统进程或者有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);

【讨论】:

以上是关于Android - 推送通知已开启?的主要内容,如果未能解决你的问题,请参考以下文章

推送示例android gcm,已注册设备但未收到推送通知

如何清除状态栏上的推送通知警报 - android

即使App已关闭,也会收到Android推送通知

Android 推送通知未收到

Android 推送通知失败(注册无效)

解析标记为已发送但在设备上看不到的 android 推送通知