2017-05-03 49 views
8

Próbuję programowo dowiedzieć się, dla których aplikacji wyjątkowo pominięto ustawienie Nie przeszkadzać.Jak znaleźć aplikacje dozwolone w obszarze "Powiadomienia o priorytetowych aplikacjach" w ustawieniu Nie przeszkadzać?

enter image description here

tej pory używam następujący kod, aby sprawdzić, czy telefon jest ustawiony w pracy w trybie lub nie nie przeszkadzać:

public static boolean isDnDModeEnabled(Context context) 
{ 
    if(Build.VERSION.SDK_INT <23) 
     return false; 

    try { 
     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     int filterValue = notificationManager.getCurrentInterruptionFilter(); 
     switch(filterValue) 
     { 
      case NotificationManager.INTERRUPTION_FILTER_ALL : Log.d("DND","Interruption filter all"); 
       break; 
      case NotificationManager.INTERRUPTION_FILTER_ALARMS : Log.d("DND","Interruption filter alarms"); 
       break; 
      case NotificationManager.INTERRUPTION_FILTER_PRIORITY : Log.d("DND","Interruption filter priority"); 
       break; 
      case NotificationManager.INTERRUPTION_FILTER_UNKNOWN : Log.d("DND","Interruption filter unknown"); 
       break; 
      case NotificationManager.INTERRUPTION_FILTER_NONE : Log.d("DND","Interruption filter none"); 
       break; 

     } 
     if(filterValue == NotificationManager.INTERRUPTION_FILTER_ALL) 
      return false; 
     else if(filterValue == NotificationManager.INTERRUPTION_FILTER_PRIORITY) 
     { 
      //Logic based on which apps are allowed as priority 

      return true; //or false 
     } 
     else 
      return true; 
    } 
    catch(Exception e) 
    { 
     return false; 
    } 
} 

Kiedy klikam na priorytetowych aplikacji notiications zakładka, otrzymuję listę wszystkich zainstalowanych aplikacji, dla których mogę wybrać, które aplikacje mają być dozwolone jako wyjątki priorytetowe.

Moje pytanie brzmi: jak programowo uzyskać listę aplikacji, które są dozwolone jako priorytetowe wyjątki dla trybu Nie przeszkadzać, a tym samym zdefiniować logikę zastępującą komentarz w powyższym kodzie? Wszelkie rozwiązania zostaną gruntownie docenione.

Odpowiedz

2

Szukacie sposobu, aby określić, które aplikacje w systemie mają znaczenie powiadamiania o Notification.IMPORTANCE_MAX i, przykro powiedzieć, ale nie jest to możliwe przez aplikacja niesystemowa. Potrzebujesz dostępu do INotificationService, aby móc zadzwonić pod numer getImportance(packageName). Zobacz the Notification Manager source ale guarded by a check który zapewnia jesteś aplikacja systemu lub aplikacji, których pakiet zdałeś więc odbicie jest obecnie ...

Google umożliwia aplikację aby uzyskać własną wagę powiadomień poprzez NotificationManager z getImportance() (see docs), ale nie możesz wywołać tego z dowolną paczką.

Inna odpowiedź tutaj odnosi się do sprawdzenia źródła z aplikacji ustawień systemowych i to jest dokładnie to, co zrobiłem, a po chwili śledzenia kodu odkryłem, w jaki sposób określają, które aplikacje powinny pojawić się w "Zastąpieniu Menu "Nie przeszkadzać" przez this code here, co doprowadziło mnie do odkrycia, jak możemy określić użytkownika, ale sugestie drugiego odbierającego nie będą działać, ponieważ są nieprawidłowe (packages.xml nie ma informacji) lub wymaga korzenia, które nie jest niezawodne na wszystkich urządzeniach.

+0

Jak to się mówi, że tylko aplikacje systemowe mogą uzyskać do niego dostęp? Nie dostałem części "strzeżony przez czek" – SoulRayder

+0

@SoulRayder: sprawdź link z tekstem "strzeżony czekiem". Android zdaje sobie sprawę z tego, że niektórzy ludzie są podchwytli i będą próbować odzwierciedlić w usługach systemowych, aby uzyskać dostęp do funkcji, które nie są odpowiednio wyeksponowane, więc tworzą kontrole w usługach systemowych, które sprawdzają, czy wywoływane są tylko te aplikacje, do których można je wywoływać. Oto funkcja, która Cię zablokuje: http://androidxref.com/7.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java#checkCallerIsSameApp –

0

Można spróbować następujących rzeczy (niektóre z tych rzeczy może potrzebować dostępu uprawnień):

  1. Pobierz kod źródłowy do ustawień aplikacji i zobaczyć, jak ustawienia aplikacji jest coraz listę.
  2. Analizuje pakiety.xml. W tym miejscu przechowywana jest duża ilość informacji o aplikacjach.
  3. Sprawdź, czy lista jest przechowywana w settings.db