studio programacion para libros libro edición desarrollo desarrollar aprende aplicaciones android android-notifications android-notification-bar

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



manual de programacion android pdf (5)

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?


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


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

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


No puedes 100% no puede.

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

Editar

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

Use 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).


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ó


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