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)
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)
如果您在Android支持库修订版22.2.1(2015年7月)中进行链接,则此问题现已解决:
NotificationCompat.MediaStyle该类提供了[n] API这是我的解决方法" 支持库中没有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)
MediaStyle目前 Android 支持包中似乎没有向后移植。
最终,一旦 Android 5.0 源代码可用,有人可能能够制作一个独立的向后移植。或者,也许 Android 支持包将来会添加向后移植。
但是,目前,AFAICT,您无法创建与MediaStyle一起使用的NotificationCompat.
| 归档时间: |
|
| 查看次数: |
14320 次 |
| 最近记录: |