13

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

在此处输入图像描述

谢谢

4

2 回答 2

8

假设您指的是 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 消息到达时,您的应用不会显示任何内容。

于 2013-06-04T14:49:43.327 回答
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);
}
于 2013-08-27T01:46:18.657 回答