NotificationCompat.setStyle()不能得到Notification.MediaStyle

当我使用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