当我使用NotificationCompat.builder(this)
发出通知时,我发现MediaStyle setStyle不起作用。
我的意思是,当在NotificationCompat.Builder(this)
上使用它时:
.setStyle(new Notification.MediaStyle() .setMediaSession(mySession))
它说它想要得到NotificationCompat.style
而不是Notification.MediaStyle
。
你能帮我解决这个问题吗? 有没有更换NotificationCompat?
谢谢。
在v4软件包中没有`NotificationCompat.MediaStyle`,但是它确实存在于v7软件包中。 确保导入:import android.support.v7.app.NotificationCompat; 而不是v4包。 它从appcompat库的v22.2.0开始为我工作。
从版本26.0.0开始,v7软件包已过时 。 但是,所有的function已经添加到v4! 好极了! 🎉
资源
Guillermo是正确的,MediaStyle只存在于v7支持包中,但不幸的是,当你纠正你的包时,它可能仍然是有问题的,因为这可能只是你的问题的一部分。
首先是一些背景…
每一次configurationNotificationBuilder的调用都会返回构build器实例,从而允许实现者链接configuration调用,如下所示:
// 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()));
这是一个非常正常和方便的模式,唯一的问题是返回的生成器实例types为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年7月)中链接,现在就解决了这个问题:
NotificationCompat.MediaStyle
类提供了[n] API 这是我的解决方法:“ 支持库中没有NotificationCompat.MediaStyle ”。
它可以避免复制应用程序逻辑,并且在NotificationCompat支持MediaStyle
可以很容易地find解决方法。
目的:这使得使用API 21+中的MediaStyle
(提供紧凑和扩展的通知布局,button)或旧版本的Android上的普通通知布局(只有一个布局,带button)更容易。
注意:如果您的目标是在多个Android版本的locking屏幕上放置button,则可以使用此方法来实现API 21+的locking屏幕通知,还可以为较旧的API实施locking屏幕控件。
如何:首先,创build一个新的通知构build器兼容性包,从一个接口开始,以交替基础实现。 来自NotificationCompat.Builder
Crib,剥离到所需的function:
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
构build一个实现:
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
构build一个实现:
@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(); } }
第四,添加一个工厂方法来实例化右侧的构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); }
临时修复:截止到9/11/2017,人们可以使用完全合格的课程作为解决方法。 使用Android 3.0 Beta 5 Preview进行testing,使用API 26.0.1构build工具
// 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,你不能创build一个MediaStyle
用于NotificationCompat
。