Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NotificationCompat.setStyle()可以';无法获取通知。MediaStyle_Android_Notifications - Fatal编程技术网

Android NotificationCompat.setStyle()可以';无法获取通知。MediaStyle

Android NotificationCompat.setStyle()可以';无法获取通知。MediaStyle,android,notifications,Android,Notifications,我发现当我使用MediaStyle时,MediaStyle设置样式不起作用 NotificationCompat.builder(此)发出通知 我的意思是,在NotificationCompat.Builder(this)上使用它时: 它说它想获得NotificationCompat.style,而不是Notification.MediaStyle 你能帮我解决那个问题吗? 有没有人可以代替NotificationCompat 谢谢。目前Android支持包中似乎没有MediaStyle的后端口

我发现当我使用MediaStyle时,MediaStyle设置样式不起作用
NotificationCompat.builder(此)
发出通知

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

它说它想获得
NotificationCompat.style
,而不是
Notification.MediaStyle

你能帮我解决那个问题吗? 有没有人可以代替NotificationCompat


谢谢。

目前Android支持包中似乎没有
MediaStyle
的后端口

最终,一旦安卓5.0源代码可用,可能有人能够设计一个独立的后端口。或者,Android支持包将来可能会添加一个后端口

但是,目前,AFAICT无法创建用于
NotificationCompat

更新的
MediaStyle
如果您现在链接(2015年7月),此问题已修复:

  • 为类提供了[n]API
旧的解决方法 这是我对“”的解决方法

如果NotificationCompat支持
MediaStyle
,它可以避免重复应用程序逻辑,并且可以很容易地退出解决方案

目的:这使得API 21+中的
MediaStyle
易于使用(提供紧凑和扩展的通知布局,带有按钮),或者旧版本Android上的普通通知布局(只有一个布局,带有按钮)

注意:如果您的目标是在多个版本的Android上设置锁屏按钮,那么您可以使用这种方法为API 21+实现锁屏通知,也可以为较旧的API实现锁屏小部件

方法:首先,创建一个新的notification builder兼容包,从一个接口开始,以替代底层实现。从
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();
    }
}
@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();
    }
}
第三,在
通知.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();
    }
}
@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);
}
v4包中没有'NotificationCompat.MediaStyle',但它确实存在于v7包中。确保导入: 导入android.support.v7.app.NotificationCompat; 而不是v4包。从appcompat库的v22.2.0开始,它对我有效。


从26.0.0版开始,v7软件包已弃用。但是,所有功能都已添加到v4!耶 Guillermo是正确的,MediaStyle只存在于v7支持包中,但不幸的是,在更正包时,它可能仍然会给您带来问题,因为这可能只是您问题的一部分

首先是一些背景
每个配置NotificationBuilder的调用都会返回builder实例,这反过来又允许实现者链接如下配置调用:

    // 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()));
这是一个非常正常和方便的模式,唯一的问题是返回的生成器实例的类型是android.support.v4.app.NotificationCompat.Builder,而不是您期望的android.support.v7.app.NotificationCompat.Builder

因此,解决方法看似简单。。。在进行这些调用时,只需显式地继续使用v7构建器实例:)


临时解决方案:从2017年9月11日起,可以使用完全合格的课程作为解决方案。使用Android 3.0 Beta 5预览版和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();

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

builder.setStyle(new androidx.media.app.NotificationCompat.MediaStyle());
别忘了在build.gradle(模块:app)中添加依赖项


对于Androidx添加以下代码

  • build.gradle(模块:app)中添加此依赖项
  • 无论您在setStyle方法中使用Notification.MediaStyle()时,请使用以下代码
builder.setStyle(新的androidx.media.app.NotificationCompat.MediaStyle());

那么,您有什么替代品吗?你在“如果”中放入的东西,如果它的Android 5.0?@user3184899,它将发出媒体风格的通知:你必须切换到使用
Notification.Builder
,而不是
NotificationCompat.Builder
,如果
Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.LOLLIPOP
。请参阅此“修复程序”是否允许锁定屏幕上的媒体按钮使用任一版本?@kevin Android<21在锁定屏幕上没有任何通知,也没有通知区域的媒体样式。因此,在Android<21上,这个
setMediaStyleActionsInCompactView()
方法没有任何作用,但它在Android 21上添加了压缩媒体样式按钮。调用
builder.addAction()
仍然会在所有支持它的Android版本中向通知添加按钮。明白了。但是…我知道有可能在@kevin上设置媒体按钮,这取决于你的要求。在API 21之前,您仍然可以调用
addAction()
来添加多达3个操作按钮,并且您可以下载Android设计图标来获取暂停、播放、停止等按钮图像。API 21引入了
MediaStyle
,在大视图中最多支持5个按钮;3在紧凑视图中。还可以定义自定义布局。如果你与Cyanogen的内置音乐播放器Apollo进行比较,Cyanogen是否为此提供定制API?如果有人需要,这是完整的源代码,非常感谢。我使用了错误的构建器,一天(很长时间)都无法解决问题。NotificationCompat.MediaStyle在v4中仍然不存在,到目前为止,我的坏消息。它已移动到
android.support.v4.media.app.NotificationCompat.MediaStyle
。如果您使用的是
AndroidX
,请改用“android.support.v4.media.app.NotificationCompat.MediaStyle”。关于这篇好文章的更多细节:如果你愿意,试试这个
implementation "androidx.media:media:1.2.0"
  implementation "androidx.media:media:1.1.0"