为 android10 中的通知操作设置背景颜色

set background color to notifications actions in android10

我做到了 image link by following this article https://medium.com/@dcostalloyd90/show-incoming-voip-call-notification-and-open-activity-for-android-os-10-5aada2d4c1e4 通知按钮工作正常。唯一的问题是我无法像上面文章中那样为这些操作按钮设置背景颜色。我想分别设置绿色和红色来接受和取消按钮。我怎样才能做到这一点? 检查以下代码:

val notificationBuilder =
            NotificationCompat.Builder(this@IncomingTripService, CHANNEL_ID2)
                .setSmallIcon(R.drawable.logo2)
                .setContentTitle("New trip incoming")
                .setContentText("Respond as soon as possible")
                .setSound(null)
                .addAction(R.drawable.buttons,"ACCEPT", receiveCallPendingIntent)
                .addAction(R.drawable.buttons, "CANCEL", cancelCallPendingIntent)
                .setAutoCancel(true)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setFullScreenIntent(fullScreenPendingIntent, true)

buttons.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
        android:color="@android:color/black"
        >
    </solid>
    <corners
        android:radius="15dp">
    </corners>

</shape>

我希望你的问题仍然相关。我也 运行 解决了这个问题,但经过一些研究后,我决定不使用“样式化”操作(没有按预期工作),而是使用自定义通知布局。

是的,还有一个选项可以将自定义视图附加到通知,RemoteViews:

NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.some_drawable)
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setCategory(NotificationCompat.CATEGORY_CALL)
            .setStyle(NotificationCompat.DecoratedCustomViewStyle())
            .setCustomContentView(notificationLayout) // <--- attach custom layout
            .build()

notificationLayout创建如下:

val notificationLayout = RemoteViews(contex.packageName, R.layout.some_layout)
notificationLayout.setOnClickPendingIntent(R.id.some_button, actionPendingIntent)

您的布局 some_layout 可以是您为自定义对话框、片段或活动创建的普通布局。但请注意,RemoteViews 的布局仅限于以下视图和视图组: https://developer.android.com/reference/android/widget/RemoteViews

如果您使用文档中未列出的其他视图或视图组,您的通知将不会显示。

也关注 https://developer.android.com/training/notify-user/custom-notification。在这里你可以找到一些有用的提示,为什么你应该为你在布局中使用的 TextView 使用预定义的样式,以符合白天和夜间模式,而不是意外地有白色文本。

如果一切正常,您可以想出像这样的样式通知:

PS:如果您想为来电(或类似的东西)创建自定义通知,并且希望您的通知始终保持打开状态而不是折叠到托盘中,请添加一个FullscreenIntent 到您的通知 (https://developer.android.com/training/notify-user/time-sensitive):

notificationBuilder.setFullScreenIntent(anotherActionPendingIntent, true)

并且不要忘记在清单中包含所需的权限:

<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />

PPS:作为补充,这里是自定义通知的完整布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtTitle"
        style="@style/TextAppearance.Compat.Notification.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/notification_incoming_call_title" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnAccept"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_weight="1"
            android:backgroundTint="@color/notification_incoming_call_accept"
            android:text="@string/notification_incoming_call_accept"
            android:textAllCaps="false"
            android:textColor="@color/notification_incoming_call_text" />

        <Button
            android:id="@+id/btnDecline"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_weight="1"
            android:backgroundTint="@color/notification_incoming_call_decline"
            android:text="@string/notification_incoming_call_decline"
            android:textAllCaps="false"
            android:textColor="@color/notification_incoming_call_text" />
    </LinearLayout>
</LinearLayout>