2013-08-08 7 views
13

Chciałbym uzyskać jak najwięcej informacji z obiektu StatusBarNotification -obiekt, jak to tylko możliwe. W tej chwili jedyną "wiarygodną" informacją, którą można uzyskać, jest właściwość tickerText. Używam następujący kod, aby uzyskać tytuł notyfikacji i tekst przez RemoteViews, ale wiele czasu, tytuł i/lub tekst będzie po prostu zerowa :-(:Wiarygodny sposób pobierania informacji StatusbarNotification (tytuł, tekst powiadomienia)

//Get the title and text 
    String mTitle = ""; 
    String mText = ""; 
    try { 
     RemoteViews remoteView = sbn.getNotification().contentView; 
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ViewGroup localView = (ViewGroup) inflater.inflate(remoteView.getLayoutId(), null); 
     remoteView.reapply(getApplicationContext(), localView); 
     TextView tvTitle = (TextView) localView.findViewById(android.R.id.title); 
     TextView tvText = (TextView) localView.findViewById(16908358); 
     mTitle = (String)tvTitle.getText(); 
     mText = (String)tvText.getText(); 
    } catch (Exception e){ 
     Log.e(TAG, "Error getting notification title/text: " + e); 
    } 

Czy istnieje alternatywa (bardziej niezawodny) Mogę "ręcznie" kodować identyfikatory zasobów dla "popularnych" powiadomień, takich jak Gmail, SMS itp., ale może to przerwać w dowolnym momencie, gdy te aplikacje są aktualizowane.Dzięki!

Odpowiedz

3

Sprawdzanie identyfikatorów zasobów w rzeczywistości to, w jaki sposób TalkBack, czytnik ekranu systemu Android, analizuje typy powiadomień, a następnie próbuje załadować identyfikatory bezpośrednio z różnych pakietów:

C heck the source on Google Code dla pełnego przykładu. Oto fragment:

private static int ICON_GMAIL; 

private static boolean sHasLoadedIcons = false; 

private static void loadIcons(Context context) { 
    ... 

    ICON_GMAIL = loadIcon(context, "com.google.android.gm", 
     "com.google.android.gm.R$drawable", "stat_notify_email"); 

    sHasLoadedIcons = true; 
} 

public static NotificationType getNotificationTypeFromIcon(Context context, int icon) { 
    if (!sHasLoadedIcons) { 
     loadIcons(context); 
    } 

    ... 

    if (icon == ICON_GMAIL) { 
     return NotificationType.EMAIL; 
    } 
} 
+0

Dzięki, alanv, to naprawdę interesujące! Nie sądziłem, że byłoby to podejście "akceptowalne", ponieważ nazwy (i int-ID) zasobów w innych pakietach mogą się zmieniać cały czas. Spróbuję więc ręcznie wyłowić identyfikatory zasobów najpopularniejszych pól tekstowych związanych z tytułem/streszczeniem powiadomień. – Nick

+0

@Wyzywaj jakieś pomysły na to, jak to zrobiłeś? Ponadto, wiele razy wyjątki są zgłaszane podczas próby nadmuchania identyfikatora zasobu układu. – nhaarman

+2

@Niek, udostępnię tutaj moje rozwiązanie, gdy już to zrobię. Dostaję również wyjątki od inflacji układu: - /. Widziałem inne rozwiązanie, które polega na iteracji nad układem TextView ids (bez wcześniejszego zawyżania rzeczywistego układu). Zobaczę, czy uda mi się go znaleźć ponownie. – Nick

Powiązane problemy