NotificationCompat.setStyle()无法获取Notification.MediaStyle

时间:2014-10-19 17:39:27

标签: android notifications

我发现MediaStyle setStyle在我使用时无法正常工作 NotificationCompat.builder(this)发出通知。

我的意思是,在NotificationCompat.Builder(this)上使用它时:

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

它说它想要NotificationCompat.style而不是Notification.MediaStyle

你能帮我解决这个问题吗? NotificationCompat有没有替代品?

感谢。

7 个答案:

答案 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)

<德尔> v4包中没有“NotificationCompat.MediaStyle”,但它确实存在于v7包中。确保导入:     import android.support.v7.app.NotificationCompat; 而不是v4包。从appcompat库的v22.2.0开始,它一直在为我工作。

自版本26.0.0起,v7软件包已弃用。但是,所有功能都已添加到v4!好极了!

Source

答案 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()));

这是非常正常的&amp;方便的模式,唯一的问题是返回的Builder实例是android.support.v4.app.NotificationCompat.Builder类型,&amp;不是你期望的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月)中链接,则此问题现已解决:

较旧的解决方法

以下是“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 ,添加以下代码

  • build.gradle(Module:app)中添加此依赖项
  implementation "androidx.media:media:1.1.0"
  • 在setStyle方法中使用Notification.MediaStyle()的任何地方,请使用以下代码
  builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle());

答案 6 :(得分:2)

目前Android支持包中似乎没有MediaStyle的后退。

最终,一旦Android 5.0源代码可用,有人可能能够制作独立的反向端口。或者,Android支持包可能会在未来添加一个backport。

但是,目前,AFAICT,您无法创建MediaStyleNotificationCompat一起使用。