2013-07-25 15 views
9

Android ma nową usługę powiadamiania słuchacza jak od 4.3: http://developer.android.com/about/versions/jelly-bean.html http://developer.android.com/reference/android/service/notification/NotificationListenerService.htmlUzyskiwanie dostępu do Android Ustawienia NotificationListenerService

Od docs:

dostęp Powiadamianie jest domyślnie wyłączona - aplikacje mogą korzystać z nowej zamiarem zabierz użytkownika bezpośrednio do Ustawienia, aby włączyć usługę detektora po instalacji.

Nie widzę zamiaru strzelania udokumentowanego gdziekolwiek. Uważne doc Ustawienia nie wydaje się pomocne: http://developer.android.com/reference/android/provider/Settings.html

Patrząc na klasę Ustawienia bezpośrednio: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/provider/Settings.java

widzę ACTION_NOTIFICATION_LISTENER_SETTINGS zdefiniowane, ale przy użyciu Android Studio i wskazując na 4,3 ACTION_NOTIFICATION_LISTENER_SETTINGS nie może być rozwiązany:

Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); 

Próbuje go więcej ręcznie nie wydają się działać:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.setClassName("com.android.settings", "android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

edit: robi to we właściwy sposób jako CommonsWare wskazał poniżej:

Intent intent=new Intent("android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

prowadzi do katastrofy:

(android.content.ActivityNotFoundException: brak aktywności stwierdzono rączką intencyjny {akt = android.settings.NOTIFICATION_LISTENER_SETTINGS})

Czy brakuje mi czegoś? Nie wiem, jak wysłać użytkownika do właściwego ekranu ustawień, aby włączyć tę usługę w mojej aplikacji.

+0

ciekawe pytanie. Czy dzięki nowemu API można uzyskać tekst powiadomienia i opis? – Cilenco

+0

Tak, po skonfigurowaniu usługi możesz pobrać powiadomienia bezpośrednio (http://developer.android.com/reference/android/app/Notification.html). – powerj1984

+0

Okay świetnie! Ale nie istnieją żadne matematyki, aby uzyskać tekst powiadomienia lub opis z "StatusBarNotification" – Cilenco

Odpowiedz

14

Czy czegoś brakuje?

Cóż, w swoim ostatnim przypadku łączysz ciąg akcji z nazwą klasy. Podejście „ręczny” będzie:

Intent intent=new Intent("android.settings.NOTIFICATION_LISTENER_SETTINGS"); 

Pod względem dlaczego Android Studio nie jest znalezienie Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS, że nie mogę powiedzieć.


UPDATE

Na podstawie dyskusji w komentarzach, Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS nie jest w Android SDK (obecnie oznaczone @hide).Również manifestu aplikacji Ustawienia ma nieco inną wersję napisu Działanie:

Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
+0

Okazało ACTION_NOTIFICATION_LISTENER_SETTINGS has @hide w dokumentacji, która Zgaduję, że nie powinno tam być - choć myślałem, że to po prostu ukryje dokumentację, nie uniemożliwi rozstrzygnięcia w ithin Android Studio. Niestety próbując go w sposób, o którym mowa w swojej odpowiedzi kończy się z hukiem: Spowodowany przez: android.content.ActivityNotFoundException: Nie stwierdzono aktywny uchwyt Intent {act = android.settings.NOTIFICATION_LISTENER_SETTINGS – powerj1984

+1

@ powerj1984: „Okazuje się, że ma ACTION_NOTIFICATION_LISTENER_SETTINGS @Hide w dokumentacji "- nie widzę tego w źródle, z którym się łączyłeś. "chociaż myślałem, że to po prostu ukryje dokumentację" - nie, "@ hide" całkowicie usuwa element z SDK. Odnośnie 'ActivityNotFoundException', co testujesz? – CommonsWare

+0

Numer linii 667 w połączonym źródle nie ma @hide? Dziwne, robi to po mojej stronie. Testowanie na Nexusie 4 z 4.3 – powerj1984

5

dodatkowy do CommonsWare odpowiedź Oto jak sprawdzić, czy masz to zezwolenie

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 
    boolean weHaveNotificationListenerPermission = false; 
    for (String service : NotificationManagerCompat.getEnabledListenerPackages(this)) { 
     if (service.equals(getPackageName())) 
      weHaveNotificationListenerPermission = true; 
    } 
    if (!weHaveNotificationListenerPermission) {  //ask for permission 
     Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); 
     startActivity(intent); 
    } 
} 
Powiązane problemy