2015-01-07 8 views
9

W ustawieniach Androida użytkownicy mogą wyłączyć powiadomienia, jeśli nie chcą. Czy istnieje jakaś metoda sprawdzania, czy moja aplikacja może wyświetlać powiadomienia? A jak otworzyć stronę ustawień Androida, aby poprowadzić użytkowników do włączania powiadomień?Jak sprawdzić, czy moja aplikacja może wyświetlać powiadomienia?

+0

To może pomóc: http://stackoverflow.com/questions/24145343/checking-android-system-security-notification-access-setting-programmatically – TheTanic

+1

Możliwy duplikat [Android 4.1: Jak sprawdzić powiadomienia są wyłączony dla aplikacji?] (http://stackoverflow.com/questions/11649151/android-4-1-how-to-check-notifications-are-disabled-for-the-application) – Sam

Odpowiedz

28

EDIT - Nowy Odpowiedź:

Wygląda google dodaje prawidłowego połączenia API: NotificationManagerCompat.from(context).areNotificationsEnabled()


OLD ODPOWIEDŹ:

Dla każdego, kto patrzy na to pytanie, trzeba pamiętać, że NotificationListenerService różni się od „Pokaż powiadomienie ". Te dwa są różne rzeczy! Jeśli aplikacja ma dostęp do numeru NotificationListenerService, nie oznacza to, że wyświetlane są jej powiadomienia i na odwrót. W celu sprawdzenia, czy użytkownik zablokował powiadomienia z aplikacji lub nie, można użyć refleksji:

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() { 

    AppOpsManager mAppOps = (AppOpsManager) GlobalContext.getContext().getSystemService(Context.APP_OPS_SERVICE); 

    ApplicationInfo appInfo = GlobalContext.getContext().getApplicationInfo(); 

    String pkg = GlobalContext.getContext().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; 
} 
} 

Źródło: https://code.google.com/p/android/issues/detail?id=38482

+0

dzięki! to bardzo pomaga! –

+0

Dziękujemy! Uratowałeś mój dzień! –

+0

AppOpsManager został dodany na poziomie API 19 (Android 4.4), więc można go używać tylko dla poziomu interfejsu API 19+ – nibarius

-1

Spróbuj tego:

if (Settings.Secure.getString(getActivity().getContentResolver(), "enabled_notification_listeners").contains(getActivity().getPackageName())) { 
    // Notification access service already enabled 
    Toast.makeText(getActivity(),"notification enabled",Toast.LENGTH_LONG).show(); 
} else { 
    Intent intent = new Intent(); 
    intent.setClassName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity"); 
    intent.putExtra("app_package", getPackageName()); 
    intent.putExtra("app_uid", getApplicationInfo().uid); 
    startActivity(intent); 
} 
+0

To jest dla usługi NotificationListenerService, która różni się od POWIADOMIENIA ZGŁOSZENIA !!! – Kasra

24
NotificationManagerCompat.from(context).areNotificationsEnabled() 

wydaje się droga.

+0

Testowałem to ręcznie zmieniając uprawnienia powiadomień w ustawieniach i działało dobrze, boolean został poprawnie zwrócony w obu przypadkach. Świetne, jednoliniowe rozwiązanie. I właśnie w czasie .. Szukałem rozwiązania tylko kilka godzin po tym, jak ta odpowiedź została wysłana .. tak dobre wyczucie czasu :) Dzięki! – gnB

+0

@gnB nice! cieszę się, że pomogło;) – asamoylenko

+0

To powinna być zaakceptowana odpowiedź +1 – Sniper