2013-08-21 17 views
26

Ich habe meine Systemmusik-App (von Sony Ericsson für Android GB 2.3.7) dekompiliert, weil ich das Benachrichtigungslayout ändern möchte. Ich fand die Methode, die die Benachrichtigung mit diesem Code erstellt:Benachrichtigungslayout ändern

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

Meine Frage ist jetzt: Wie kann ich das Benachrichtigungslayout ändern? Ich möchte ein Layout erstellen, das wie das ursprüngliche Android-Benachrichtigungslayout aussieht, aber mit einem zusätzlichen Bild rechts neben der Benachrichtigung. Wie kann ich das machen?

Antwort

76

Erstellen Sie zuerst ein XML für Ihre Benachrichtigung.

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> 

Nun ist die Java-Code:

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

Hoffnung dieses Ding für Sie arbeitet.

Bearbeiten: Sie können auch besuchen, wenn Sie auf Problem wie this stoßen.

Sie können auch here für weitere Informationen besuchen.

bearbeiten 26. April 2016 Sie NotificationCompat.Builder zum Erstellen Notification Beispiel wie unten verwenden:

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

Vielen Dank dafür. Du wirst das Kopfgeld bekommen, aber ich kann es dir in einer Stunde geben;) – Cilenco

+2

@Cilenco Kein Problem, Schatz. Ich habe dir für die Kopfgeldübergabe überhaupt nicht geholfen. Ich bin einfach glücklich, dass meine Lösung für dich funktioniert hat, das ist es ... :) Ich liebe es, Menschen zu helfen, mit was immer ich weiß. Glückliche Kodierung ...! –

+0

@ shree202 gibt mir einen Vorschlag. Ich erstelle eine große Benachrichtigungsansicht mit RemoteView, um die Wiedergabe/Pause wie diese Verbindung zu steuern (stackoverflow.com/questions/14508369/...) Alle sind richtig, aber wenn ich Gerät zurück Schaltfläche und aus dem Anwendungsklick klicken Ereignis (Wiedergabe/Pause/Vorwärts/Schließen) -Taste funktioniert nicht. Bitte helfen Sie mir. –

0

Es wäre schön, wenn wir die Layoutdaten erhalten könnten, egal ob in Code oder XML diktiert.

gehen von dem, was zur Verfügung gestellt wird, obwohl ich sagen kann, dass Sie das Bild bekommen müssen und setzen Sie es in die new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); Deklaration.

Ehrlich gesagt ist das alles, was ich Ihnen mit dem geben kann, was Sie zur Verfügung gestellt haben. Viel Glück!

2

Um benutzerdefinierte Benachrichtigungslayouts zu erstellen, sehen Sie sich das Android API Guide on the subject an. Es sieht so aus, als würden Sie die Klasse RemoteViews verwenden.

4

Hier habe ich eine Screenshots angeschlossen haben, die ersten Bildschirminhalt ein Titel der Post und wenn wir auf den Abwärtspfeil auf der rechten Seite des App-Namens klicken, führt dies zum zweiten Screenshot, der ein benutzerdefiniertes Layout für Push-Benachrichtigungen ist. Das folgende ist ein Beispiel-Layout, das ich für meinen entworfen habe.

<?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> 

Verfahren zum Erstellen von Benachrichtigung mit benutzerdefinierten Layout,

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

Awesome Mahn, half viel. –