Android 城市飞艇:默认状态栏通知的自定义图标

Android 城市飞艇:默认状态栏通知的自定义图标,android,urbanairship.com,android-notifications,android-notification-bar,Android,Urbanairship.com,Android Notifications,Android Notification Bar,Urban Airship建议,如果要对状态栏通知进行任何修改,包括简单地更改图标,请使用CustomPushNotificationBuilder创建自定义通知 不幸的是,使用RemoteView进行通知会带来许多与定制制造商和/或特定于平台的皮肤相关的不必要的影响,以及对私有资源的引用(例如@*android:drawable/notify_panel_notification_图标_bg_tile) 必须有一种简单的方法来交换图标,而无需使用RemoteView。如何设置?我发现,通过覆盖

Urban Airship建议,如果要对状态栏通知进行任何修改,包括简单地更改图标,请使用
CustomPushNotificationBuilder
创建自定义通知

不幸的是,使用
RemoteView
进行通知会带来许多与定制制造商和/或特定于平台的皮肤相关的不必要的影响,以及对私有资源的引用(例如
@*android:drawable/notify_panel_notification_图标_bg_tile


必须有一种简单的方法来交换图标,而无需使用
RemoteView
。如何设置?

我发现,通过覆盖
BasicPushNotificationBuilder
,我可以非常轻松地设置图标:

BasicPushNotificationBuilder nb = new BasicPushNotificationBuilder() {
    @Override
    public Notification buildNotification(String alert,
            Map<String, String> extras) {
        Notification notification = super.buildNotification(alert,
                extras);
        // The icon displayed in the status bar
        notification.icon = R.drawable.notification;
        // The icon displayed within the notification content
        notification.contentView.setImageViewResource(
                android.R.id.icon, R.drawable.notification);
        return notification;
    }
};
// Set the custom notification builder
PushManager.shared().setNotificationBuilder(nb);
BasicPushNotificationBuilder nb=new BasicPushNotificationBuilder(){
@凌驾
公共通知buildNotification(字符串警报,
地图(附加){
通知通知=super.buildNotification(警报,
额外费用);
//状态栏中显示的图标
notification.icon=R.drawable.notification;
//通知内容中显示的图标
notification.contentView.setImageViewResource(
android.R.id.icon,R.drawable.notification);
退货通知;
}
};
//设置自定义通知生成器
PushManager.shared().setNotificationBuilder(nb);

我知道这是一个老问题,但城市航空经常更新,所以我决定帮助其他可能访问此页面的人。从6.0.1版开始,不再有
BasicNotificationBuilder
。为了使用图标、颜色等定制通知,您需要扩展
NotifcationFactory
类,并重写
createNotification
方法

如下例所示:

public class MyNotificationFactory extends NotificationFactory {

public MyNotificationFactory(Context context){
    super(context);
}

@Override
public Notification createNotification(PushMessage pushMessage, int i) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext())
            .setContentTitle(getContext().getResources().getString(R.string.app_name))
            .setContentText(pushMessage.getAlert())
            .setSmallIcon(R.drawable.your_icon_here)
            .setColor(getContext().getResources().getColor(R.color.your_color_here))
            .setAutoCancel(true);

    return builder.build();
}

@Override
public int getNextId(PushMessage pushMessage) {
    return NotificationIDGenerator.nextID();
}
}

最后,您必须在应用程序类或初始化UA的任何位置将其设置为UrbanAirship的新通知工厂:

UAirship.shared().getPushManager().setNotificationFactory(new MyNotificationFactory(getApplicationContext()));

我们在默认的通知工厂中提供了很多功能,如大样式(收件箱、文本、图像)、棒棒糖功能(隐私、优先级)和交互式通知按钮。如果您只想设置图标,可能还想设置重点颜色,我建议您:

    UAirship.takeOff(this, new UAirship.OnReadyCallback() {
        @Override
        public void onAirshipReady(UAirship airship) {
            // Perform any airship configurations here

            // Create a customized default notification factory
            DefaultNotificationFactory defaultNotificationFactory = new DefaultNotificationFactory(getApplicationContext());
            defaultNotificationFactory.setSmallIconId(R.drawable.ic_notification);
            defaultNotificationFactory.setColor(NotificationCompat.COLOR_DEFAULT);

            // Set it
            airship.getPushManager().setNotificationFactory(defaultNotificationFactory);
        }
    });

这个类的完整文档可以在这里找到-

嘿,Paul,我将处理自定义图标并修改插件,以便在出现多个通知时只显示一个图标。您的代码示例看起来是一个很好的起点,我想感谢您回答了自己的问题。我想知道你是否可以解释一下你在哪里重写了这段代码?我对Android开发相当陌生,我的应用程序正在使用Phonegap。因此,我甚至不知道这段代码会去哪里。任何帮助都会很好。谢谢@RyanMartin无需修改原始库而弄脏您的手。您可以通过将上述代码放在应用程序的
onCreate()
中来覆盖该功能。您需要定义自己扩展
应用程序的类,并使用
中的
android:name=“…”
属性在清单中声明它。要使所有通知都显示在一个图标下,一个好的开始是设置一个固定的通知ID。看看你能走多远,如果你有任何困难,可以随意放置一个新问题的链接。这可能为我节省了一个小时的猜测和检查时间。谢谢在应用程序生命周期中,您将其称为什么?完美答案。他们为什么不更新他们的文档。使用城市飞艇太难了。可怜的文档。@Harpreet我们试图更新文档。你能提供更多关于我们的文档质量差的细节吗?如何在城市飞艇通知图标点击上显示应用程序?