2013-08-08 12 views
13

Vorrei ottenere più informazioni da un StatusBarNotification -oggetto possibile. Al momento, l'unica informazione "affidabile" a cui è possibile accedere è la proprietà tickerText. Sto utilizzando il seguente codice per ottenere il titolo del testo di notifica e via RemoteViews, ma un sacco di tempo, il titolo e/o testo sarà semplicemente :-(nullo:Modo affidabile di recuperare StatusbarNotifica dettagli (titolo, testo di notifica)

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

C'è qualche alternativa (più affidabile possibile? Potrei "codificare a mano" gli ID delle risorse per notifiche "popolari" come Gmail, SMS, ecc., ma questo potrebbe interrompersi in qualsiasi momento quando tali app sono aggiornate. Grazie!

risposta

3

Controllare gli ID delle risorse è in realtà il modo in cui TalkBack, lo screen reader Android, analizza i tipi di notifica e tenta di caricare gli ID direttamente da vari pacchetti.

C diamine il source on Google Code per un esempio completo. Ecco un frammento:

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

Grazie, alanv, è davvero interessante! Non pensavo che questo sarebbe stato un approccio "accettabile", dal momento che i nomi (e int-ID) delle risorse in altri pacchetti possono cambiare continuamente. Proverò a scavare manualmente gli ID delle risorse dei campi di testo titolo/notifica di riepilogo dell'app più popolari, quindi. – Nick

+0

@ Hai qualche idea su come lo faresti? Inoltre, molte volte vengono generate eccezioni quando si tenta di aumentare l'ID della risorsa di layout. – nhaarman

+2

@Niek, condividerò qui la mia soluzione una volta terminata. Ottengo anche le eccezioni di inflazione del layout: - /. Ho visto un'altra soluzione dove eseguono l'iterazione degli id ​​di TextView del layout (senza gonfiare in anticipo il layout effettivo). Vedrò se riesco a trovarlo di nuovo. – Nick

Problemi correlati