En las aplicaciones de Android, a veces se necesita saber si las notificaciones del sistema están activadas para poder realizar el siguiente paso, por lo que obtener este estado es muy necesario. Antes siempre sufría por no encontrar un método adecuado para resolverlo, porque después de todo involucra al sistema y no es fácil. Hoy vi a un experto dar un consejo, lo probé y funciona muy bien. Lo comparto para que todos lo vean, ¡acepten esta recomendación!
Hay imágenes que lo demuestran: primero, ve a Configuración y desactiva el interruptor de notificaciones de la aplicación:
Luego, en la aplicación, haz clic en el botón para obtener el estado:
En este momento, vuelve a Configuración y activa el interruptor de notificaciones:
Vuelve a hacer clic en el botón de prueba en la aplicación y verás que las notificaciones ya están disponibles:
La cantidad de código es muy pequeña, pero es muy concisa. Solo es una clase de utilidad que utiliza el principio de reflexión de Java:
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;
}
}
Autor colaborador: Zhao Weiwei
Correo de contacto: 865397504@qq.com