Cambiar presentación de notificaciones
He descompilado mi aplicación de música del sistema (de Sony Ericsson para Android GB 2.3.7) porque quiero cambiar el diseño de la notificación. Encontré el método que crea la notificación con este código:
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); } }
Mi pregunta ahora es: ¿Cómo puedo cambiar el diseño de la notificación? Quiero crear un diseño que se parezca al diseño original de la notificación de Android, pero con una imagen adicional a la derecha de la notificación. ¿Cómo puedo hacer esto?
- Empilar las notificaciones no funciona
- Protocolo utilizado para enviar notificaciones push en Android
- Desactivar las notificaciones de una aplicación mediante programación en Android
- Cómo cambiar el color de la barra de estado en android
- Cómo crear alarmas persistentes incluso después de reiniciar
- Notificación específica de Android Wear
- Cambiar el fondo del icono de notificación en Lollipop
- En Android, ¿cómo puedo saber el ID de notificación actual para borrar la notificación
- ¿Han caducado los ID de registro de GCM?
- Desactivar las capacidades de notificación de las bibliotecas
- La notificación android lanza la misma actividad dos veces
- ¿Cómo actualizar la notificación con RemoteViews?
- ¿Puedo probar las notificaciones de la barra de estado utilizando el marco de pruebas de Android?
Primero cree un xml para su notificación.
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>
Ahora el código 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; } }
Espero que esto funcione para usted.
Editar: También puede visitar si se encuentra con un problema como este .
También, puede visitar aquí para más información.
Editar Abril 26 2016 Puede utilizar NotificationCompat.Builder
para crear la instancia de Notification
como se indica a continuación:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(icon) .setContent(contentView) .setContentTitle("Custom Notification") .setWhen(when); ... mNotificationManager.notify(1, notificationBuilder.build());
Para crear diseños de notificaciones personalizadas, consulte la Guía de la API de Android sobre el tema . Parece que vas a usar la clase RemoteViews
.
Aquí he adjuntado una captura de pantalla, el contenido de la primera pantalla de un título de la publicación y cuando hacemos clic en la flecha hacia abajo en el lado derecho del nombre de la aplicación que conduce a la segunda captura de pantalla que es el diseño personalizado para notificación push. Que he diseñado para la mía.
<?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>
Método para crear notificaciones con diseño personalizado,
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; } }
Sería bueno si pudiéramos obtener los datos de diseño, ya sea dictado en código o xml.
Saliendo de lo que se proporciona sin embargo, puedo decir que usted tiene que conseguir la imagen y ponerla en la new Notification(2130837696, paramTrack.getTitle() + " - " + str, System.currentTimeMillis());
declaración.
Honestamente eso es todo lo que puedo darte con lo que has proporcionado. ¡La mejor de las suertes!
- Cargando el archivo html desde la carpeta local en la vista web
- ¿Hay alguna manera de tener una y sólo una instancia de cada actividad?