Android应用 - 检测应用推送通知是否已关闭

时间:2016-07-05 08:36:23

标签: android push-notification

在我们的Android应用程序(使用SDK23编译)中,默认情况下,应用程序安装后,“推送通知”设置为“打开”。但当然用户可以手动“关闭”它。

2个问题:

在应用内,使用Android API,是否可能(简而言之,如何?):

  1. 检查“推送通知”设置的当前状态是(打开还是关闭)?

  2. 类似于我们可以将用户重定向到GPS设备设置,如果GPS“关闭”,如果设置为“关闭”,我们是否还可以将用户重定向到“推送通知设置”,以便用户那么,如果他愿意,可以“打开”它?

  3. 令我们惊讶的是(也许我们错了?因此我们在这里寻求您的意见/确认)似乎上述“1”和“2”都不可能??? !!

    如果我们错了,我们很可能会欣赏一个短的“简短的一般术语”来实现这一目标。

    感谢您输入!

3 个答案:

答案 0 :(得分:2)

根据文件,第1是可能的。我没有查看问题的第二部分(将用户带到通知设置)。

要查看通知的当前状态,首先您必须知道您所使用的设备是否低于Oreo。在Oreo下面,它就像在支持库的NoticificationManagerCompat对象上调用areNotificationsEnabled()一样简单(从版本24.1.0开始提供)。在奥利奥或以上,您需要通过在NotificationChannel对象上调用getImportance()来检查每个通知渠道。如果停用通知,getImportance()将返回NotificationManager.IMPORTANCE_NONE。如果它返回任何其他内容,则会启用它们。这里有一些代码可以完成这项工作:

public boolean areNotificationsEnabled(Context context, String channelId) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if(!TextUtils.isEmpty(channelId)) {
            NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel channel = manager.getNotificationChannel(channelId);
            return channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
        }
        return false;
    } else {
        return NotificationManagerCompat.from(context).areNotificationsEnabled();
    }
}

希望这有帮助!

答案 1 :(得分:0)

您可以通过此命令检查系统推送是启用还是禁用。

NotificationManagerCompat.from(context).areNotificationsEnabled()

答案 2 :(得分:0)

您可以使用以下命令检查用户是否允许您的应用程序通知:

NotificationManagerCompat.from(context).areNotificationsEnabled()

此一线代码适用于API级别19+。但是,从android O开始,引入了通知通道。这允许用户从应用程序设置屏幕仅禁用特定的通知通道,并且还禁用来自应用程序的所有通知。使用上面的命令,您只能检查整个应用程序(而非特定渠道)是否允许通知。意思是,即使上面的命令给出的值为true

,您也看不到任何通知。

仅当应用程序允许所有通知并且所有现有通知通道均已启用时,下面的代码才返回true。从API级别19+开始工作,包括从Android O开始所需的更改:

public boolean areNotificationsEnabled() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
      if (!manager.areNotificationsEnabled()) {
        return false;
      }
      List<NotificationChannel> channels = manager.getNotificationChannels();
      for (NotificationChannel channel : channels) {
        if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
          return false;
        }
      }
      return true;
    } else {
      return NotificationManagerCompat.from(context).areNotificationsEnabled();
    }
  }