我发现MediaStyle setStyle在我使用时无法正常工作
NotificationCompat.builder(this)
发出通知。
我的意思是,在NotificationCompat.Builder(this)
上使用它时:
.setStyle(new Notification.MediaStyle()
.setMediaSession(mySession))
它说它想要NotificationCompat.style
而不是Notification.MediaStyle
。
你能帮我解决这个问题吗? NotificationCompat有没有替代品?
感谢。
答案 0 :(得分:21)
对于2020年的AndroidX,您可以使用以下代码-
builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle());
不要忘记在build.gradle(Module:app)中添加androidx.media依赖项
implementation "androidx.media:media:1.2.0"
答案 1 :(得分:20)
自版本26.0.0起,v7软件包已弃用。但是,所有功能都已添加到v4!好极了!
答案 2 :(得分:16)
临时修复:截至9/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();
答案 3 :(得分:10)
Guillermo是正确的,MediaStyle仅存在于v7支持包中,但不幸的是,在纠正您的包时,您可能仍然存在问题,因为这可能只是您问题的一部分。
首先是一些背景...
每次调用配置NotificationBuilder都会返回构建器实例,这反过来允许实现者链接配置调用,如下所示:
// 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()));
答案 4 :(得分:7)
如果您在Android Support Library revision 22.2.1(2015年7月)中链接,则此问题现已解决:
NotificationCompat.MediaStyle
类以下是“There is no NotificationCompat.MediaStyle in the support library”的解决方法。
它避免了重复应用程序逻辑,并且当NotificationCompat支持MediaStyle
时,可以轻松退出解决方法。
目的:这样可以轻松使用API 21+中的MediaStyle
(提供紧凑和扩展的通知布局,带按钮),或旧版Android上的普通通知布局(只有一个布局,带按钮)。
注意:如果您的目标是在多个Android版本的锁定屏幕上放置按钮,您可以使用此方法为API 21+实施锁定屏幕通知,并实现锁定屏幕旧API的小部件。
如何:首先,创建一个新的通知构建器兼容包,从备用底层实现的接口开始。来自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();
}
}
第四,添加工厂方法来实例化正确的构建器:
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);
}
答案 5 :(得分:3)
对于 Androidx ,添加以下代码
implementation "androidx.media:media:1.1.0"
Notification.MediaStyle()
的任何地方,请使用以下代码 builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle());
答案 6 :(得分:2)
目前Android支持包中似乎没有MediaStyle
的后退。
最终,一旦Android 5.0源代码可用,有人可能能够制作独立的反向端口。或者,Android支持包可能会在未来添加一个backport。
但是,目前,AFAICT,您无法创建MediaStyle
与NotificationCompat
一起使用。