2013-08-21 6 views
26

Ho decompilato la mia app di musica di sistema (da Sony Ericsson per Android GB 2.3.7) perché voglio modificare il layout delle notifiche. Ho trovato il metodo che crea la notifica con questo codice:Modifica notifica layout

private void sendStatusBarNotification(Track paramTrack) 
{ 
    if (paramTrack != null) 
    { 
     NotificationManager localNotificationManager = (NotificationManager)this.mContext.getSystemService("notification"); 
     String str = paramTrack.getArtist(); 

     if ((str == null) || (str.equals(this.mContext.getString(2131361954)))) 
      str = this.mContext.getString(2131361798); 

     Notification localNotification = new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); 
     localNotification.flags = (0x2 | localNotification.flags); 
     localNotification.flags = (0x20 | localNotification.flags); 

     PendingIntent localPendingIntent = PendingIntent.getActivity(this.mContext, 0, new Intent(this.mContext, MusicActivity.class), 268435456); 
     localNotification.setLatestEventInfo(this.mContext, paramTrack.getTitle(), str, localPendingIntent); 
     localNotificationManager.notify(0, localNotification); 
    } 
} 

La mia domanda ora è: come posso modificare il layout delle notifiche? Voglio creare un layout che assomigli al layout di notifica Android originale, ma con un'immagine aggiuntiva a destra della notifica. Come posso fare questo?

risposta

76

Per prima cosa creare un xml per la notifica.

custom_notification.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/layout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" > 
    <ImageView android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_marginRight="10dp" /> 
    <TextView android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/image" 
     style="Custom Notification Title" /> 
    <TextView android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/image" 
     android:layout_below="@id/title" 
     style="Custom Notification Text" /> 
</RelativeLayout> 

Ora il codice Java:

public class MainActivity extends Activity { 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     int icon = R.drawable.ic_launcher; 
     long when = System.currentTimeMillis(); 
     Notification notification = new Notification(icon, "Custom Notification", when); 

     NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

     RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification); 
     contentView.setImageViewResource(R.id.image, R.drawable.ic_launcher); 
     contentView.setTextViewText(R.id.title, "Custom notification"); 
     contentView.setTextViewText(R.id.text, "This is a custom layout"); 
     notification.contentView = contentView; 

     Intent notificationIntent = new Intent(this, MainActivity.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
     notification.contentIntent = contentIntent; 

     notification.flags |= Notification.FLAG_NO_CLEAR; //Do not clear the notification 
     notification.defaults |= Notification.DEFAULT_LIGHTS; // LED 
     notification.defaults |= Notification.DEFAULT_VIBRATE; //Vibration 
     notification.defaults |= Notification.DEFAULT_SOUND; // Sound 

     mNotificationManager.notify(1, notification); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

Speranza questa cosa funziona per voi.

Modifica: È inoltre possibile visitare se si incontra un problema come this.

Inoltre, è possibile visitare here per ulteriori informazioni.

Modifica 26 aprile 2016 È possibile utilizzare NotificationCompat.Builder per la creazione di Notification esempio come di seguito:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(icon) 
      .setContent(contentView) 
      .setContentTitle("Custom Notification") 
      .setWhen(when); 
... 
mNotificationManager.notify(1, notificationBuilder.build()); 
+0

Grazie per questo. Otterrai la taglia ma posso dartela in un'ora;) – Cilenco

+2

@Cilenco Nessun problema caro. Non ti ho aiutato affatto per la generosità. Mi sento felice che la mia soluzione abbia funzionato per te, questo è ... :) Adoro aiutare le persone con qualsiasi conoscenza. Happy Coding ...! –

+0

@ shree202 mi dà un suggerimento. Costruisco una vista grande di notifica usando RemoteView per controllare la riproduzione/pausa come questo link (StackOverflow.it/questions/14508369/...) Tutti hanno ragione ma quando faccio clic sul pulsante indietro del dispositivo e fuori dall'applicazione, l'evento click (Riproduci/Pausa/Avanti/Chiudi) non funziona. Aiutatemi. –

0

Sarebbe bello poter ottenere i dati del layout, sia esso dettato in codice o xml.

andare via di ciò che è fornito, però, posso dire che devi ottenere l'immagine e metterla nella dichiarazione new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis());.

Onestamente questo è tutto ciò che posso darti con quello che hai fornito. Buona fortuna!

2

Per creare layout di notifica personalizzati, consultare la Guida API Android on the subject. Sembra che tu stia per utilizzare la classe RemoteViews.

4

Qui Ho allegato una screenshot, i primi contenuti dello schermo di un titolo del post e quando clicchiamo sulla freccia verso il basso sul lato destro del nome della app, questo porta al secondo screenshot che è il layout personalizzato per la notifica push. Di seguito è riportato un esempio di layout che ho progettato per il mio.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_margin="4dp" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" 
card_view:cardCornerRadius="5dp" 
card_view:cardUseCompatPadding="true"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:orientation="horizontal" 
    android:background="#80000000" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:src="@mipmap/ic_launcher" 
     android:layout_width="50dp" 
     android:layout_height="match_parent" 
     android:padding="10dp" 
     android:layout_marginLeft="5dp" 
     android:background="@null" 
     android:layout_gravity="center_vertical|center_horizontal" 
     android:scaleType="centerCrop"/> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:minHeight="48dp" 
     android:paddingBottom="16dp" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     android:paddingTop="16dp" 
     android:background="@android:color/transparent" 
     android:textColor="@android:color/white" 
     tools:text="Test"/> 
</LinearLayout> 
<ImageView 
    android:id="@+id/image" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:adjustViewBounds="true" 
    android:contentDescription="@null" 
    android:scaleType="centerCrop" 
    android:src="@drawable/placeholder"/> 
</LinearLayout> 

Metodo di creazione di notifica con layout personalizzato,

public static void createNotification(String title, String body,String image_url, Context context, int notificationsId, String single_id) { 
    Intent notificationIntent; 

    long when = System.currentTimeMillis(); 
    int id = (int) System.currentTimeMillis(); 

    Bitmap bitmap = getBitmapFromURL(image_url); 
    NotificationCompat.BigPictureStyle notifystyle = new NotificationCompat.BigPictureStyle(); 
    notifystyle.bigPicture(bitmap); 
    RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout); 
    contentView.setImageViewBitmap(R.id.image, bitmap); 
    contentView.setTextViewText(R.id.title, body); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setStyle(notifystyle) 
      .setCustomBigContentView(contentView) 
      .setContentText(body); 
    NotificationManager mNotificationManager = (NotificationManager) context 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationIntent = new Intent(context, SinglePost.class); 
    notificationIntent.putExtra("single_id",single_id); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, id, notificationIntent, 0); 

    Notification notification = mBuilder.build(); 
    notification.contentIntent = contentIntent; 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.defaults |= Notification.DEFAULT_SOUND; 
    notification.defaults |= Notification.DEFAULT_VIBRATE; 


    mNotificationManager.notify(notificationsId, notification); 

} 

public static Bitmap getBitmapFromURL(String strURL) { 
    try { 
     URL url = new URL(strURL); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Impressionante mahn, aiutato molto. –