Pregunta Android 4.1: ¿Cómo verificar notificaciones están deshabilitadas para la aplicación?


Android 4.1 ofrece al usuario una casilla de verificación para deshabilitar las notificaciones de una aplicación específica.

Sin embargo, como desarrollador no tenemos manera de saber si una llamada para notificar fue efectiva o no.

Realmente necesito verificar si las notificaciones están deshabilitadas para la aplicación actual, pero no puedo encontrar ninguna configuración para eso en la API.

¿Hay alguna forma de verificar esta configuración en el código?


74
2017-07-25 11:58


origen


Respuestas:


No puedes 100% no puede.

Se pregunta en este video de Google I / O 2012 y el líder del Proyecto para las nuevas notificaciones declara que no puede.


Editar

Actualización 2016: Ahora puedes verificarlo, como se dijo en este video de Google I / O 2016.

Utilizar NotificationManagerCompat.areNotificationsEnabled(), desde la biblioteca de soporte, para verificar si las notificaciones están bloqueadas en la API 19+. Las versiones debajo de API 19 devolverán verdadero (las notificaciones están habilitadas).

enter image description here


109
2017-07-25 12:25



En realidad, esto es bastante fácil de hacer:

/**
 * 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;
    }
}

38
2018-05-07 17:31



La respuesta de @blundell es correcta, pero hay un cambio menor en las versiones más recientes.

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

14
2018-01-02 16:58



Si está utilizando Xamarin y necesita esta respuesta, puede usar este código:

//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
2018-02-02 06:11



Parece que no hay forma de consultar el estado de notificación.

Recomiendo esto:

  • Diseña tu aplicación con notificaciones.
  • Permita que el usuario desactive las notificaciones desde la configuración de la aplicación.
  • Verifica si se hace clic en las notificaciones. Si el usuario hace clic en la notificación, guárdela en las preferencias.
  • En su aplicación, si la configuración de notificación está activada, y si el usuario es Android 4.1 o superior (API 16), pero si el usuario no hace clic en notificación durante algunos días o semanas, suponga que el usuario desactivó las notificaciones.

No es 100% correcto. Pero esto da una opinión.
Por ejemplo, si el usuario no hace clic en ninguna notificación de la aplicación durante 10-15 días, probablemente la desactivó


4
2018-05-08 12:36