Изменение цвета фона уведомлений RemoteViews

У меня проблема с изменением цвета фона с помощью темы приложения.

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this);

TypedValue typedValue = new TypedValue();

getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true);

int iPrimaryColor = typedValue.data;

getTheme().resolveAttribute(R.attr.colorPrimaryDark, typedValue, true);

int iPrimaryDarkColor = typedValue.data;

Intent notIntent = new Intent(getApplicationContext(), MainActivity.class);
notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent notOpenOnClick = PendingIntent.getActivity(getApplicationContext(), 0, notIntent, PendingIntent.FLAG_UPDATE_CURRENT);

RemoteViews smallContentView = new RemoteViews(getPackageName(), R.layout.notification_small);
RemoteViews bigContentView = new RemoteViews(getPackageName(), R.layout.notification_expanded);

nBuilder.setSmallIcon(R.drawable.not_icon)
    .setOngoing(true)
    .setContentTitle(getCurrentSong().getTitle())
    .setContentIntent(notOpenOnClick);

Notification not = nBuilder.build();

smallContentView.setInt(R.id.not_linLayout, "setBackgroundColor", iPrimaryColor);
smallContentView.setInt(R.id.not_imvDivider, "setBackgroundColor", iPrimaryDarkColor);

bigContentView.setInt(R.id.not_linLayout, "setBackgroundColor", iPrimaryColor);
bigContentView.setInt(R.id.not_imvDivider, "setBackgroundColor", iPrimaryDarkColor);

setListeners(smallContentView);
setListeners(bigContentView);

not.contentView = smallContentView;
not.bigContentView = bigContentView;

if (isPlaying()) {
    not.contentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_pause_48dp);
    not.bigContentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_pause_48dp);
}
else {
    not.contentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_play_48dp);
    not.bigContentView.setImageViewResource(R.id.not_btnPlayPause, R.drawable.ic_play_48dp);
}

Я уже пробовал это, но фон моего уведомления все еще белый. Идентификаторы верны, представление linLayout — это LinearLayout.

Пожалуйста, имейте в виду: все коды вызываются в сервисе!

Спасибо!


person the_dani    schedule 24.06.2016    source источник
comment
Похоже, вы пытаетесь создать уведомление управления мультимедиа. Пожалуйста, не используйте для этого настраиваемое уведомление, а вместо этого используйте NotificationCompat.MediaStyle   -  person ianhanniballake    schedule 25.06.2016
comment
Хорошо, но почему лучше использовать MediaStyle?   -  person the_dani    schedule 25.06.2016
comment
1) Работает на устройствах API 7+ 2) Использует встроенный стиль Lollipop+ 3) Автоматически адаптируется к новому стилю уведомлений Android N 4) Встроена поддержка пользовательского цвета фона 5) Встроена поддержка решения проблем с отключение уведомлений от служб переднего плана на устройствах до Lollipop 6) Поддерживает добавление вашего токена MediaSession для обеспечения работы элементов управления Android Wear. Назвать несколько.   -  person ianhanniballake    schedule 25.06.2016
comment
Вам следует посмотреть доклад о передовых методах воспроизведения мультимедиа I/O 2016.   -  person ianhanniballake    schedule 25.06.2016
comment
Ок, отлично, спасибо :)   -  person the_dani    schedule 25.06.2016


Ответы (2)


Многое из этого можно упростить, воспользовавшись преимуществами NotificationCompat. Медиастиль. Он извлекает цвет фона из setColor. () вызывается на устройствах до API 24 (и использует этот цвет в качестве акцента на устройствах с API 24+). Это также означает, что вам больше не нужно писать какой-либо пользовательский код RemoteViews, поскольку он зависит исключительно от действий, которые вы добавляете в свое уведомление для управления мультимедиа:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this);
nBuilder.setSmallIcon(R.drawable.not_icon)
  .setContentTitle(getCurrentSong().getTitle())
  .setContentIntent(notOpenOnClick);
// This is what sets the background color on <N devices
// It is an accent color on N+ devices
nBuilder.setColor(getResources().getColor(R.color.colorPrimary));
// Add actions via nBuilder.addAction()
// Set the style, setShowActionsInCompactView(0) means the first
// action you've added will be shown the non-expanded view
nBuilder.setStyle(new NotificationCompat.MediaStyle()
  .setShowActionsInCompactView(0));

Вам обязательно следует ознакомиться со всеми методами, доступными для MediaStyle и ознакомьтесь с докладом о передовых методах воспроизведения мультимедиа I/O 2016, например кодом и рекомендации по использованию уведомлений. В частности, на через 30 минут после начала выступления

person ianhanniballake    schedule 24.06.2016
comment
можете выложить пример кода? я пытался найти что-то полезное, но там, например. цвет фона остается черным - person the_dani; 25.06.2016

документация setColorized говорит:

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

Это следует использовать только для текущих задач с высоким приоритетом, таких как навигация, текущий вызов или другие события с аналогичным высоким приоритетом для пользователя.

Для большинства стилей цвет будет применяться только в том случае, если уведомление предназначено для уведомления службы переднего плана.

Однако для уведомлений MediaStyle и DecoratedMediaCustomViewStyle, к которым подключен мультимедийный сеанс, такого требования нет.

Вызов этого метода в любой версии до O не повлияет на уведомление и не будет окрашен.

Код Котлина:

import android.support.v4.media.session.MediaSessionCompat
import android.support.v4.media.session.PlaybackStateCompat
import androidx.core.app.NotificationCompat
import androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle

// create a MediaSession so that we can create a DecoratedMediaCustomViewStyle
val mediaSession = MediaSessionCompat(applicationContext,"tag")
mediaSession.setFlags(0)
mediaSession.setPlaybackState(PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_NONE,0,0f)
        .build())

// create & display the colorized notification
notificationManager.notify(
        0,
        NotificationCompat
                .Builder(this,notificationChannel)
                .setStyle(DecoratedMediaCustomViewStyle()
                        .setMediaSession(mediaSession.sessionToken))
                .setSmallIcon(R.drawable.ic_app_foreground)
                .setColor(getColor(android.R.color.black))
                .setColorized(true)
                .setContentText("Hello, World!")
                .build())

....

// cleanup upon dismissing the notification
mediaSession.release()
person Eric    schedule 31.05.2019