Ответ 1
Начиная с версии 26.0.0, пакет v7 устарел. Тем не менее, все функциональные возможности были добавлены в v4! Ура! 🎉
Я выяснил, что MediaStyle setStyle не работает, когда я использую
NotificationCompat.builder(this)
, чтобы сделать уведомление.
Я имею в виду, если использовать это на NotificationCompat.builder(this)
:
.setStyle(new Notification.MediaStyle()
.setMediaSession(mySession))
Он говорит, что хочет получить NotificationCompat.style
вместо Notification.MediaStyle
.
Можете ли вы помочь мне решить эту проблему? Есть ли замена NotificationCompat?
Спасибо.
Начиная с версии 26.0.0, пакет v7 устарел. Тем не менее, все функциональные возможности были добавлены в v4! Ура! 🎉
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()));
Эта проблема исправлена, если вы ссылаетесь на версию библиотеки поддержки Android 22.2.1 (июль 2015 г.):
NotificationCompat.MediaStyle
classЗдесь мой обход для В библиотеке поддержки нет 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);
}
Временное исправление: по состоянию на 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();
В настоящее время в пакете поддержки Android не отображается обратная ссылка MediaStyle
.
В конце концов, как только исходный код Android 5.0 станет доступен, кто-то может создать независимый резерв. Или, возможно, пакет поддержки Android добавит backport в будущем.
Но в настоящее время, AFAICT, вы не можете создать MediaStyle
для использования с NotificationCompat
.