Intereting Posts
Как применять ориентацию EXIF ​​для изображений как URL-адреса в android Ошибка автозапуска Android autoLink Android динамически добавляет элемент из макета xml Импорт com.google.android.gms.location.LocationClient не может быть разрешен Пользовательское уведомление с динамическим расположением в удаленном представлении Android: Как получить только две цифры после точки в десятичном значении? Не хотите урезать значение EditText в ListView необходимо настроить Resize, но потерять фокус-ошибку Как установить unicode в textview, чтобы показать emoji в android? Android – отправить файл изображения в базу данных сервера Android-атрибут макета Android android: layout_toLeftOf Google plus: Невозможно загрузить видимые круги Тестирование Android-модуля с использованием проекта ant с библиотекой Android – DialogFragment с компоновкой, содержащей фрагмент ORMLITE ORDER_BY с несколькими столбцами React native – перезагрузка ничего не делать

Android 4.1: Как проверить уведомления для приложения отключены?

Android 4.1 предлагает пользователю флажок для отключения уведомлений для конкретного приложения.

Однако, как разработчик, мы не имеем возможности узнать, эффективен ли звонок для уведомления.

Мне действительно нужно проверить, отключены ли уведомления для текущего приложения, но я не могу найти никаких параметров для этого в API.

Есть ли способ проверить этот параметр в коде?

Вы не можете 100% не можете.

Он задан в этом видеообъявлении Google I / O 2012, а руководство проекта для новых уведомлений объявляет, что вы не можете.


редактировать

2016: теперь вы можете проверить это, как сказано в этом видеоролике Google I / O 2016 .

Используйте NotificationManagerCompat.areNotificationsEnabled() из библиотеки поддержки, чтобы проверить, заблокированы ли уведомления в API 19+. Версии ниже API 19 вернут true (уведомления активированы).

Введите описание изображения здесь

На самом деле это довольно легко сделать:

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

Ответ от @blundell верен, но в новых версиях есть незначительные изменения.

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

Кажется, что нет способа запросить состояние уведомления.

Я рекомендую это:

  • Создайте приложение с уведомлениями.
  • Позвольте пользователю отключить уведомления из настроек приложения.
  • Проверьте, нажаты ли уведомления. Если пользователь нажимает на уведомление, сохраните его в настройках.
  • В вашем приложении, если настройка уведомлений включена, и если пользователь является Android 4.1+ (API 16), но если пользователь не нажимает уведомление в течение нескольких дней / недель, предположите, что пользователь отключил уведомления.

Не 100% правильно. Но это дает мнение.
Например, если пользователь не нажимает уведомления о приложении в течение 10-15 дней, возможно, он отключил его

Если вы используете Xamarin, и вам нужен этот ответ, вы можете использовать этот код:

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