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

use*_*899 20 notifications android

我发现当我NotificationCompat.builder(this)用来发出通知时,MediaStyle setStyle不起作用 .

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

.setStyle(new Notification.MediaStyle()
         .setMediaSession(mySession))
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Vik*_*kaS 23

对于 2020 年的 AndroidX,您可以使用以下代码 -

builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle());
Run Code Online (Sandbox Code Playgroud)

不要忘记在 build.gradle(Module:app) 中添加androidx.media依赖项

implementation "androidx.media:media:1.2.0"
Run Code Online (Sandbox Code Playgroud)


Gui*_*uiz 20

v4包中没有"NotificationCompat.MediaStyle",但它确实存在于v7包中.确保导入:import android.support.v7.app.NotificationCompat; 而不是v4包.从appcompat库的v22.2.0开始,它对我有用.

从版本26.0.0开始,不推荐使用 v7软件包.但是,所有功能都已添加到v4!好极了!

资源

  • 我的错.它已移至`android.support.v4.media.app.NotificationCompat.MediaStyle`. (2认同)

And*_*Lam 17

临时修复:截至2009年11月9日,我们可以使用完全限定的类作为解决方法.使用Android 26 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();
Run Code Online (Sandbox Code Playgroud)


小智 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()));
Run Code Online (Sandbox Code Playgroud)

这是一个非常正常和方便的模式,唯一的问题是返回的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()));
Run Code Online (Sandbox Code Playgroud)


Jer*_*101 7

更新

如果您在Android支持库修订版22.2.1(2015年7月)中进行链接,则此问题现已解决:

较旧的解决方法

这是我的解决方法" 支持库中没有NotificationCompat.MediaStyle ".

它避免了重复应用程序逻辑,并且如果/当NotificationCompat支持时,可以轻松地退出解决方法MediaStyle.

目的:这样可以轻松使用MediaStyleAPI 21+(提供紧凑和扩展的通知布局,带按钮),或旧版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();
}
Run Code Online (Sandbox Code Playgroud)

其次,建立一个实现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();
    }
}
Run Code Online (Sandbox Code Playgroud)

第三,建立一个实现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();
    }
}
Run Code Online (Sandbox Code Playgroud)

第四,添加工厂方法来实例化正确的构建器:

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);
}
Run Code Online (Sandbox Code Playgroud)


Com*_*are 3

MediaStyle目前 Android 支持包中似乎没有向后移植。

最终,一旦 Android 5.0 源代码可用,有人可能能够制作一个独立的向后移植。或者,也许 Android 支持包将来会添加向后移植。

但是,目前,AFAICT,您无法创建与MediaStyle一起使用的NotificationCompat.