webentwicklung-frage-antwort-db.com.de

Benachrichtigungslayout ändern

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

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 lautet nun: Wie kann ich das Benachrichtigungslayout ändern? Ich möchte ein Layout erstellen, das dem ursprünglichen Android Benachrichtigungslayout ähnelt, aber mit einem zusätzlichen Bild rechts neben der Benachrichtigung. Wie kann ich das tun?

32
Cilenco

Erstellen Sie zunächst eine XML-Datei 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 der 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;
    }
}

Hoffe, dieses Ding funktioniert für dich.

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

Sie können auch hier besuchen, um weitere Informationen zu erhalten.

Bearbeiten 26. April 2016 Sie können NotificationCompat.Builder zum Erstellen einer Notification Instanz wie folgt:

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

Hier habe ich einen Screenshot angehängt, der erste Bildschirm enthält einen Titel des Beitrags und wenn wir auf den Abwärtspfeil rechts neben dem Namen der App klicken, wird der zweite Screenshot angezeigt, bei dem es sich um ein benutzerdefiniertes Layout für die Push-Benachrichtigung handelt. Das folgende Beispiel ist das Layout das ich für meine 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>

Methode zum Erstellen einer Benachrichtigung mit benutzerdefiniertem 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;
    }
}
4
Jayakumar

Informationen zum Erstellen benutzerdefinierter Benachrichtigungslayouts finden Sie im Android API-Handbuch zum Thema . Sie werden anscheinend das RemoteViews Klasse.

3
cade

Es wäre schön, wenn wir die Layoutdaten abrufen könnten, unabhängig davon, ob sie in Code oder XML diktiert sind.

ich kann jedoch sagen, dass Sie das Bild abrufen und in die new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis()); -Deklaration einfügen müssen.

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

0
Funkyguy