wake-up-neo.com

Android 4.1: Wie überprüfe ich, ob Benachrichtigungen für die Anwendung deaktiviert sind?

Android 4.1 bietet dem Benutzer ein Kontrollkästchen zum Deaktivieren von Benachrichtigungen für eine bestimmte Anwendung.

Als Entwickler haben wir jedoch keine Möglichkeit zu wissen, ob ein Anruf zur Benachrichtigung effektiv war oder nicht.

Ich muss wirklich überprüfen, ob die Benachrichtigungen für die aktuelle Anwendung deaktiviert sind, aber ich kann keine Einstellung dafür in der API finden.

Gibt es jemals eine Möglichkeit, diese Einstellung im Code zu überprüfen?

86

Sie können nicht 100% nicht.

Es wird in dieses Google I/O 2012-Video gefragt, und der Projektleiter für die neuen Benachrichtigungen gibt an, dass dies nicht möglich ist.


Bearbeiten

2016 Update: Jetzt können Sie es überprüfen, wie in dieses Google I/O 2016 Video .

Verwenden Sie NotificationManagerCompat.areNotificationsEnabled() aus der Support-Bibliothek, um zu überprüfen, ob Benachrichtigungen auf API 19+ blockiert sind. Die Versionen unter API 19 geben true zurück (Benachrichtigungen sind aktiviert).

enter image description here

133
Blundell

Eigentlich ist das ganz einfach:

/**
 * Created by desgraci on 5/7/15.
*/
public class NotificationsUtils {

    private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static boolean isNotificationEnabled(Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);

        ApplicationInfo appInfo = context.getApplicationInfo();

        String pkg = context.getApplicationContext().getPackageName();

        int uid = appInfo.uid;

        Class appOpsClass = null; /* Context.APP_OPS_MANAGER */

        try {

            appOpsClass = Class.forName(AppOpsManager.class.getName());

            Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);

            Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
            int value = (int)opPostNotificationValue.get(Integer.class);

            return ((int)checkOpNoThrowMethod.invoke(mAppOps,value, uid, pkg) == AppOpsManager.MODE_ALLOWED);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    }
}
39
desgraci

Die Antwort von @blundell ist korrekt, es gibt jedoch eine geringfügige Änderung in neueren Versionen.

NotificationManagerCompat.from(context).areNotificationsEnabled(‌​)
30
Prakash

Wenn Sie Xamarin verwenden und diese Antwort benötigen, können Sie diesen Code verwenden:

//return true if this option is not supported.
public class NotificationsUtils 
{
    private const String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private const String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static bool IsNotificationEnabled(global::Android.Content.Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.GetSystemService(global::Android.Content.Context.AppOpsService);

        ApplicationInfo appInfo = context.ApplicationInfo;

        String pkg = context.ApplicationContext.PackageName;

        int uid = appInfo.Uid;

        try {

            var appOpsClass = Java.Lang.Class.ForName("Android.app.AppOpsManager");
            var checkOpNoThrowMethod = appOpsClass.GetMethod(CHECK_OP_NO_THROW,Java.Lang.Integer.Type,Java.Lang.Integer.Type,new Java.Lang.String().Class);//need to add String.Type

            var opPostNotificationValue = appOpsClass.GetDeclaredField (OP_POST_NOTIFICATION);
            var value = (int)opPostNotificationValue.GetInt(Java.Lang.Integer.Type);
            var mode = (int)checkOpNoThrowMethod.Invoke(mAppOps,value, uid, pkg);
            return (mode == (int)AppOpsManagerMode.Allowed);

        } catch (Exception) 
        {
            System.Diagnostics.Debug.WriteLine  ("Notification services is off or not supported");
        } 
        return true;
    }
}
4
user3030630

Anscheinend gibt es keine Möglichkeit, den Benachrichtigungsstatus abzufragen.

Ich empfehle dies:

  • Gestalten Sie Ihre Anwendung mit Benachrichtigungen.
  • Ermöglichen Sie dem Benutzer, Benachrichtigungen in den Anwendungseinstellungen zu deaktivieren.
  • Überprüfen Sie, ob Benachrichtigungen angeklickt sind. Wenn der Benutzer auf Benachrichtigung klickt, speichern Sie diese in den Einstellungen.
  • Wenn in Ihrer App die Benachrichtigungseinstellung aktiviert ist und der Benutzer Android 4.1+ (API 16) ist, der Benutzer jedoch für einige Tage/Wochen nicht auf Benachrichtigung klickt, wird davon ausgegangen, dass der Benutzer Benachrichtigungen deaktiviert hat .

Nicht 100% richtig. Das gibt aber eine Meinung.
Wenn der Benutzer beispielsweise 10-15 Tage lang nicht auf eine App-Benachrichtigung klickt, hat er diese wahrscheinlich deaktiviert

4
trante