NotificationCompat.setStyle() не может получить Notification.MediaStyle

Я выяснил, что MediaStyle setStyle не работает, когда я использую NotificationCompat.builder(this), чтобы сделать уведомление.

Я имею в виду, если использовать это на NotificationCompat.builder(this):

.setStyle(new Notification.MediaStyle()
         .setMediaSession(mySession))

Он говорит, что хочет получить NotificationCompat.style вместо Notification.MediaStyle.

Можете ли вы помочь мне решить эту проблему? Есть ли замена NotificationCompat?

Спасибо.

Ответы

Ответ 1

В пакете v4 нет пакета NotificationCompat.MediaStyle, однако он существует в пакете v7. Обязательно импортируйте:   import android.support.v7.app.NotificationCompat; вместо пакета v4. Он работает для меня с v22.2.0 библиотеки appcompat. Дел >

Начиная с версии 26.0.0, пакет v7 устарел. Тем не менее, все функциональные возможности были добавлены в v4! Ура! 🎉

Источник

Ответ 2

Guillermo верен, MediaStyle существует только в пакете поддержки v7, но, к сожалению, он может оказаться проблематичным для вас при исправлении вашего пакета, поскольку это может только часть вашей проблемы.

Сначала какой-то контекст...
Каждый вызов для настройки NotificationBuilder возвращает экземпляр builder, который, в свою очередь, позволяет разработчику цепочки конфигурирования так:

    // NOTE: To re-iterate, the import you would be using is:
    import android.support.v7.app.NotificationCompat;

    NotificationCompat.Builder myBuilder = new NotificationCompat.Builder(currContext)
    .setSmallIcon(R.drawable.ic_notification_small)
    .setLargeIcon(BitmapFactory.decodeResource(currContext.getResources(), R.drawable.ic_notification_large))
    .setStyle(new NotificationCompat.MediaStyle().setMediaSession(sessionCompat.getSessionToken()));

Это очень обычный и удобный шаблон, единственная проблема заключается в том, что возвращаемый экземпляр Builder имеет тип android.support.v4.app.NotificationCompat.Builder, а не файл android.support.v7.app.NotificationCompat.Builder что вы ожидаете.

Итак, исправление обманчиво просто... просто явным образом продолжаю использовать ваш экземпляр V7 Builder при выполнении этих вызовов:)

    // NOTE: To re-iterate, the import you would be using is:
    import android.support.v7.app.NotificationCompat;
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(currContext);
    mBuilder.setSmallIcon(R.drawable.ic_notification_small);
    mBuilder.setLargeIcon(BitmapFactory.decodeResource(currContext.getResources(), R.drawable.ic_notification_large));
    mBuilder.setStyle(new NotificationCompat.MediaStyle().setMediaSession(sessionCompat.getSessionToken()));

Ответ 3

Update

Эта проблема исправлена, если вы ссылаетесь на версию библиотеки поддержки Android 22.2.1 (июль 2015 г.):

Предыдущее обходное решение

Здесь мой обход для В библиотеке поддержки нет NotificationCompat.MediaStyle.

Он избегает дублирования логики приложения и упрощает откат обходного пути, если/когда NotificationCompat поддерживает MediaStyle.

Цель:. Это упрощает использование MediaStyle в API 21+ (предлагая компактные и расширенные макеты уведомлений с кнопками) или обычный макет уведомлений в старых версиях Android (просто один макет, с кнопками).

Примечание.. Если ваша цель - разместить кнопки на экране блокировки на нескольких версиях Android, вы можете использовать этот подход для реализации уведомлений блокировки экрана для API 21+, а также реализовать экран блокировки виджет для более старых API-интерфейсов.

Практическое руководство.. Сначала создайте новый пакет совместимости с разработчиками уведомлений, начиная с интерфейса, чтобы чередовать основные реализации. Crib из NotificationCompat.Builder, разделенный на необходимые функции:

public interface NotificationBuilder {
    public NotificationBuilder setWhen(long when);
    public NotificationBuilder setUsesChronometer(boolean b);
    public NotificationBuilder setSmallIcon(int icon);
    // ...

    /** Sets MediaStyle with setShowActionsInCompactView(). */
    public NotificationBuilder setMediaStyleActionsInCompactView(int... actions);

    public Notification build();
}

Во-вторых, выполните реализацию, построенную на NotificationCompat.Builder:

public class V20Builder implements NotificationBuilder {
    private NotificationCompat.Builder builder;

    public V20Builder(Context context) {
        builder = new NotificationCompat.Builder(context);
    }

    @Override
    public NotificationBuilder setWhen(long when) {
        builder.setWhen(when);
        return this;
    }

    @Override
    public NotificationBuilder setUsesChronometer(boolean b) {
        builder.setUsesChronometer(b);
        return this;
    }

    @Override
    public NotificationBuilder setSmallIcon(int icon) {
        builder.setSmallIcon(icon);
        return this;
    }

    // ...

    @Override
    public NotificationBuilder setMediaStyleActionsInCompactView(int... actions) {
        // Noop for Android API V20-.
        return this;
    }

    @Override
    public Notification build() {
        return builder.build();
    }
}

В-третьих, выполните реализацию, построенную на Notification.Builder:

@TargetApi(21)
public class V21Builder implements NotificationBuilder {
    private Notification.Builder builder;

    public V21Builder(Context context) {
        builder = new Notification.Builder(context);
    }

    @Override
    public NotificationBuilder setWhen(long when) {
        builder.setWhen(when);
        return this;
    }

    @Override
    public NotificationBuilder setUsesChronometer(boolean b) {
        builder.setUsesChronometer(b);
        return this;
    }

    @Override
    public NotificationBuilder setSmallIcon(int icon) {
        builder.setSmallIcon(icon);
        return this;
    }

    // ...

    @Override
    public NotificationBuilder setMediaStyleActionsInCompactView(int... actions) {
        new Notification.MediaStyle(builder).setShowActionsInCompactView(actions);
        return this;
    }

    @Override
    public Notification build() {
        return builder.build();
    }
}

В-четвертых, добавьте метод factory для создания экземпляра правильного конструктора:

public NotificationBuilder makeBuilder() {
  if (Build.VERSION.SDK_INT >= 21) { // Load the API V21 class only if the OS can load it.
      return new V21Builder(context);
  }
  return new V20Builder(context);
}

Ответ 4

Временное исправление: по состоянию на 11/11/2017, можно использовать полностью квалифицированный класс для работы. Протестировано с использованием Android 3.0 Beta 5 Preview, с инструментами сборки API 26.0.1

// The notification builder
import android.support.v4.app.NotificationCompat;

// The media style should be of type, has "media in the path
// android.support.v4.media.app.NotificationCompat.MediaStyle;

    Notification noti = new NotificationCompat.Builder(this, "Quiz")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(getString(R.string.app_name))
            .setContentText("Hi this is a media notification")
            .setContentIntent(pendingIntent)
            .setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle()
                    .setMediaSession(mMediaSession.getSessionToken()))
            .build();

Ответ 5

В настоящее время в пакете поддержки Android не отображается обратная ссылка MediaStyle.

В конце концов, как только исходный код Android 5.0 станет доступен, кто-то может создать независимый резерв. Или, возможно, пакет поддержки Android добавит backport в будущем.

Но в настоящее время, AFAICT, вы не можете создать MediaStyle для использования с NotificationCompat.