Android O - однострочное уведомление - например, "Android-система - USB-зарядка этого устройства"

Я хотел бы получить постоянное уведомление о моем ForegroundService которое требует как можно большего места. Мне нравится стиль "Android System - USB зарядка этого устройства", но я не могу найти никакого примера, как это сделать. enter image description here

Может кто-то указать мне верное направление?

Обновить

Стиль присваивается уведомлению, если каналу присвоено значение IMPORTANCE_MIN.

Похоже, что нет возможности использовать андроиды, встроенные в стиль для уведомлений IMPORTANCE_MIN которые будут использоваться с ForegroundService.

Вот описание IMPORTANCE_MIN:

Минимальное значение уведомления: только показывает в тени, под складкой. Это не должно использоваться с Service.startForeground, поскольку служба переднего плана должна быть чем-то, о чем заботится пользователь, поэтому семантический смысл не означает, что его уведомление является минимальным значением. Если вы сделаете это с версии Android Build.VERSION_CODES.O, система покажет уведомление с более высоким приоритетом о вашем приложении, работающем в фоновом режиме.

Ответ 1

Чтобы ответить на исходный вопрос:

Похоже, на Android O нет встроенного способа, чтобы получить одну строку, текущее уведомление для ForegroundService. Можно попробовать добавить пользовательский дизайн, но поскольку разные телефоны имеют разные конструкции для уведомления, это решение вряд ли является хорошим.

Есть надежда, однако :)

На Android P уведомление в NotificationChannel из IMPORTANCE_LOW с приоритетом PRIORITY_LOW уплотняется к одной линии даже для ForegroundService. Да уж!!

Ответ 2

Чтобы отобразить компактное однострочное уведомление, такое как уведомление об оплате, вам необходимо создать Notification Channel с приоритетом 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);
}

Затем создайте текущее уведомление:

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

НОТА

Обратите внимание, что я тестировал его с помощью IntentService вместо Service, и он работает. Также я только что проверил настройку Thread.sleep() в 15 секунд, и уведомление показывается отлично до тех пор, пока IntentService остановится.

Есть несколько изображений (извините, что некоторые тексты написаны на испанском языке, но я думаю, что изображения по-прежнему полезны):

Single line ongoing notification

И если вы перетащите и откроете уведомление, оно будет выглядеть следующим образом:

Single line ongoing notification opened

EXTRA

Если вы заметили, что в Android-системе отображается уведомление о том, что все приложения, использующие батареи (приложения с текущими службами), вы можете понизить приоритет такого рода уведомлений, и они появятся в виде уведомлений в одной строке, таких как уведомление о тарификации.

Взгляните на это:

Battery applications

Просто нажмите на это уведомление и выберите ВСЕ КАТЕГОРИИ:

Chennel notification for battery applications

И установите значение LOW:

enter image description here

В следующий раз это уведомление об "потреблении батареи" будет отображаться как уведомление о тарификации.

Ответ 3

Вам необходимо установить приоритет уведомлений как Min, Notification Channel значение Min и отключить показ значка канала уведомлений.

Вот пример того, как я это делаю. Я включил создание полного уведомления для справки

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

Ответ 4

Расширяемое уведомление

По умолчанию текстовое содержимое уведомлений усекается, чтобы поместиться в одну строку. Если вы хотите, чтобы ваше уведомление было длиннее, вы можете включить большую текстовую область, расширяемую, применяя дополнительный шаблон.

Кроме того, Android 4.1 поддерживает расширяемые уведомления. В дополнение к обычным уведомлениям можно определить большой вид, который отображается при расширении уведомления. Существует три стиля для большого представления: стиль большой картинки, стиль большого текста, стиль "Входящие". Следующий код демонстрирует использование BigTextStyle(), которое позволяет использовать до 256 дп.

Например :

String longText = "...";

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

Ответ 5

Попробуйте это, я уже использовал приложение.

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