showing oreo notification not example developer android android-notifications android-8.0-oreo

oreo - Android O-Notificación de línea única-como el "Sistema Android-USB cargando este dispositivo"



notification channel android (5)

Me gustaría tener una notificación en curso para mi Servicio ForegroundService que requiera el lugar más pequeño posible. Me gusta el estilo "Sistema Android - USB que carga este dispositivo", pero no encuentro ningún ejemplo de cómo lograrlo.

¿Alguien puede señalarme en la dirección correcta?

Actualizar

El estilo se otorga a la notificación si al canal se le asigna la importancia IMPORTANCE_MIN .

Parece que no hay forma de usar el estilo incorporado de Android para las notificaciones de IMPORTANCE_MIN que se usarán con un servicio ForegroundService .

Aquí está la descripción de IMPORTANCE_MIN :

Importancia mínima de notificación: solo se muestra en la sombra, debajo del pliegue. Esto no debe usarse con Service.startForeground ya que se supone que un servicio en primer plano es algo que le importa al usuario, por lo que no tiene sentido semántico marcar su notificación como de mínima importancia. Si lo hace a partir de la versión de Android Build.VERSION_CODES.O, el sistema mostrará una notificación de mayor prioridad sobre la ejecución de la aplicación en segundo plano.


Debe establecer la prioridad de notificación en Mín, la importancia del canal de notificación en Mín, y deshabilitar mostrar la insignia de canal de notificación.

Aquí hay una muestra de cómo lo hago. He incluido la creación de la notificación completa como referencia.

private static final int MYAPP_NOTIFICATION_ID= -793531; NotificationManager notificationManager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); String CHANNEL_ID = "myapp_ongoing"; CharSequence name = context.getString(R.string.channel_name_ongoing); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN); channel.setShowBadge(false); notificationManager.createNotificationChannel(channel); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_stat_notification_add_reminder) .setContentTitle(context.getString(R.string.app_name)) .setContentText(context.getString(R.string.create_new)) .setOngoing(true).setWhen(0) .setChannelId(CHANNEL_ID) .setPriority(NotificationCompat.PRIORITY_MIN); // Creates an intent for clicking on notification Intent resultIntent = new Intent(context, MyActivity.class); ... // The stack builder object will contain an artificial back stack // for the // started Activity. // This ensures that navigating backward from the Activity leads out // of // your application to the Home screen. TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); // Adds the back stack for the Intent (but not the Intent itself) stackBuilder.addParentStack(MyActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build());


Intenta esto, he estado usando in-app anteriormente.

import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.support.v7.app.NotificationCompat; import android.util.Log; import java.lang.reflect.Method; public static Notification getForegroundNotification(Context context) { Notification notification = new NotificationCompat.Builder(context) .setContentTitle(context.getString(R.string.app_name)) .setContentText("Notification text") .setAutoCancel(false) .setPriority(Notification.PRIORITY_MAX) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)) .setOngoing(true) .build(); return notification; }


Para mostrar una notificación de línea única compacta como la notificación de cobro, debe crear un Notification Channel con prioridad a IMPORTANCE_MIN.

@TargetApi(Build.VERSION_CODES.O) private static void createFgServiceChannel(Context context) { NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN); NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(channel); }

Y luego crea una notificación continua como esa:

public static Notification getServiceNotification(Context context) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id"); mBuilder.setContentTitle("One line text"); mBuilder.setSmallIcon(R.drawable.ic_notification); mBuilder.setProgress(0, 0, true); mBuilder.setOngoing(true); return mBuilder.build(); }

NOTA

Tenga en cuenta que lo he probado con un IntentService lugar de un Service , y funciona. También acabo de marcar la configuración de un Thread.sleep() de 15 segundos y la notificación se muestra perfectamente hasta que el IntentService detiene por sí solo.

Hay algunas imágenes (lo siento, algunos textos están en español, pero creo que las imágenes siguen siendo útiles):

Y si arrastra hacia abajo y abre la notificación, se muestra de la siguiente manera:

EXTRA

Si observa que el sistema Android muestra una notificación que indica todas las aplicaciones que usan batería (aplicaciones con servicios en curso), puede reducir la prioridad de este tipo de notificaciones y aparecerá como notificaciones de una línea, como la notificación de carga.

Mira esto:

Simplemente haga clic en esta notificación y seleccione TODAS LAS CATEGORÍAS:

Y establece la importancia a BAJA:

La próxima vez, esta notificación de "consumo de batería" se mostrará como la notificación de carga.


Notificación expandible

De forma predeterminada, el contenido del texto de la notificación se trunca para que quepa en una línea. Si desea que su notificación sea más larga, puede habilitar un área de texto más grande que se pueda expandir aplicando una plantilla adicional.

Además, Android 4.1 soporta notificaciones ampliables. Además de la vista de notificación normal, es posible definir una vista grande que se muestra cuando se expande la notificación. Hay tres estilos para usar con la vista grande: estilo de imagen grande, estilo de texto grande, estilo de bandeja de entrada. El siguiente código demuestra el uso de BigTextStyle () que permite utilizar hasta 256 dp.

Por ejemplo :

String longText = "..."; Notification noti = new Notification.Builder(this) ..... ..... ..... .setStyle(new Notification.BigTextStyle().bigText(longText))


Para contestar la pregunta original:

Parece que no hay una forma integrada en Android O para obtener una sola línea, una notificación en curso para un servicio ForegroundService . Uno podría intentar agregar un diseño personalizado, pero como diferentes teléfonos tienen diferentes diseños para la notificación, esa solución no es una buena.

Hay esperanza, sin embargo :)

En Android P, la notificación en un NotificationChannel de NotificationChannel de IMPORTANCE_LOW con una prioridad de PRIORITY_LOW se compacta en una sola línea, incluso para un servicio ForegroundService . ¡¡Sí!!