簡體   English   中英

Android app - 檢測應用推送通知是否關閉

[英]Android app - detect if app push notification is off

在我們的 Android 應用程序(使用 SDK23 編譯)中,“推送通知”設置在應用程序安裝后默認為“開啟”。 但用戶當然可以手動將其“關閉”。

2個問題:

在應用程序中,使用 Android API,是否可能(如何,簡單地說?):

  1. 檢查“推送通知”設置的當前狀態是什么(打開或關閉)?

  2. 類似於如果 GPS 為“關閉”,我們可以將用戶重定向到 GPS 設備設置,如果設置為“關閉”,我們是否也可以將用戶重定向到“推送通知設置”,這樣用戶就可以,如果他想,將其重新“打開”?

令我們非常驚訝的是(也許我們錯了?因此我們在這里征求您的意見/確認)似乎上面的“1”和“2”都不可能???!

如果我們錯了,我們有可能理解一個簡短的“如何,概括地說”來實現這一點。

感謝您的輸入!

您可以使用以下命令檢查用戶是否允許您的應用程序通知:

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();
  }
}

科特林

fun areNotificationsEnabled(notificationManager: NotificationManagerCompat) = when {
    notificationManager.areNotificationsEnabled().not() -> false
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
        notificationManager.notificationChannels.firstOrNull { channel ->
            channel.importance == NotificationManager.IMPORTANCE_NONE
        } == null
    }
    else -> true
}

根據文檔,第一個是可能的。 我還沒有研究你問題的第二部分(將用戶帶到通知設置)。

要檢查通知的當前狀態,您首先必須知道您所在的設備是否低於 Oreo。 在奧利奧下面,它就像在支持庫的NoticificationManagerCompat對象上調用areNotificationsEnabled()一樣簡單(從版本 24.1.0 開始可用)。 在 Oreo 或更高版本上,您需要通過在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();
    }
}

希望這有幫助!

Android O開始,引入了通知Android P開始,可以禁用整個組 必須考慮到這一點。 請參閱下面的代碼片段和示例解決方案。

fun NotificationManagerCompat.areNotificationsFullyEnabled(): Boolean {
    if (!areNotificationsEnabled()) return false
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        for (notificationChannel in notificationChannels) {
            if (!notificationChannel.isFullyEnabled(this)) return false
        }
    }
    return true
}

@RequiresApi(Build.VERSION_CODES.O)
fun NotificationChannel.isFullyEnabled(notificationManager: NotificationManagerCompat): Boolean {
    if (importance == NotificationManager.IMPORTANCE_NONE) return false
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        if (notificationManager.getNotificationChannelGroup(group)?.isBlocked == true) return false
    }
    return true
}

您可以從片段中調用它,例如:

if (!NotificationManagerCompat.from(requireContext()).areNotificationsFullyEnabled()) {
            //todo notifications DISABLED
        }

您可以通過此命令檢查您的系統推送是啟用還是禁用。

NotificationManagerCompat.from(context).areNotificationsEnabled()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM