Невозможно изменить цвет фона уведомления Android с помощью Firebase и dotnet Maui

Я использую Firebase для отправки push-уведомлений в приложение .NET8 MAUI... Уведомления работают, но цвет фона уведомления отображается как очень светло-серый, что делает невозможным увидеть значок (изображения приведены ниже)...

Предполагается, что существует обходной путь для добавления строки в файл AndroidManifest.xml, но, похоже, это не решает проблему.....

Вот соответствующая часть моего кода:

AndroidManifest.xml

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" package = "com.mycompany.myapp">
    <application android:icon = "@mipmap/appicon">

        <!-- sets the icon, which it is doing correctly. -->
        <meta-data 
            android:name = "com.google.firebase.messaging.default_notification_icon"
            android:resource = "@drawable/push_notification_icon" />

        <!-- This should set the background color of the icon when you swipe down, 
             but it doesnt seem to work -->
        <meta-data 
            android:name = "com.google.firebase.messaging.default_notification_color" 
            android:resource = "@color/default_notification_color"
            tools:replace = "android:resource" />

        <receiver android:name = "com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported = "false" />
        <receiver android:name = "com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported = "true" android:permission = "com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name = "com.google.android.c2dm.intent.RECEIVE" />
                <action android:name = "com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name = "${applicationId}" />
            </intent-filter>
        </receiver>
    </application>
    <uses-permission android:name = "android.permission.POST_NOTIFICATIONS" />
</manifest>

Платформы\Android\Ресурсы\значения\colors.xml

<?xml version = "1.0" encoding = "utf-8"?>
<resources>
    <color name = "default_notification_color">#FF0000</color>
</resources>

МауиПрограмма.cs

using Plugin.Firebase.Auth;
using Plugin.Firebase.Bundled.Shared;

#if IOS
using Plugin.Firebase.Bundled.Platforms.iOS;
#elif ANDROID
using Plugin.Firebase.Bundled.Platforms.Android;
#endif

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        return MauiApp
            .CreateBuilder()
            .UseMauiApp<App>()
            .UseMauiCompatibility()
            .UseMauiCommunityToolkit()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            })
            .RegisterFirebaseServices()
            .Build();
    }

    private static MauiAppBuilder RegisterFirebaseServices(this MauiAppBuilder builder)
    {
        builder.ConfigureLifecycleEvents(events =>
        {
#if IOS
            events.AddiOS(iOS => iOS.FinishedLaunching((app, launchOptions) => {
                CrossFirebase.Initialize(CreateCrossFirebaseSettings());
                return false;
            }));
#elif ANDROID
            events.AddAndroid(android => android.OnCreate((activity, _) =>
                CrossFirebase.Initialize(activity, CreateCrossFirebaseSettings())
            ));
#endif
        });
        builder.Services.AddSingleton(_ => CrossFirebaseAuth.Current);
        return builder;
    }

    private static CrossFirebaseSettings CreateCrossFirebaseSettings()
    {
        return new CrossFirebaseSettings(
            isAuthEnabled: true,
            isCloudMessagingEnabled: true,
            isAnalyticsEnabled: false);
    }
}

Платформы\Android\MainActivity.cs

using Plugin.Firebase.CloudMessaging;

[Activity(Label = "MyApp", Theme = "@style/Maui.SplashTheme", MainLauncher = true)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        if (OperatingSystem.IsAndroidVersionAtLeast(33))
        {
            if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.PostNotifications) != Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.PostNotifications }, 0);
            }
        }

        HandleIntent(Intent);
        CreateNotificationChannelIfNeeded();
    }

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        HandleIntent(intent);
    }

    private static void HandleIntent(Intent intent)
    {
        FirebaseCloudMessagingImplementation.OnNewIntent(intent);
    }

    private void CreateNotificationChannelIfNeeded()
    {
        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            CreateNotificationChannel();
        }
    }

    private void CreateNotificationChannel()
    {
        if (OperatingSystem.IsAndroidVersionAtLeast(26))
        {
            var channelId = $"{PackageName}.general";
            var notificationManager = (NotificationManager)GetSystemService(NotificationService);
            var channel = new NotificationChannel(channelId, "General", NotificationImportance.Default);
            notificationManager.CreateNotificationChannel(channel);
            FirebaseCloudMessagingImplementation.ChannelId = channelId;
            FirebaseCloudMessagingImplementation.SmallIconRef = Resource.Drawable.push_notification_icon;
        }
    }
}

MyApp.csproj

<Project Sdk = "Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net8.0-ios;net8.0-android</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <UseMaui>true</UseMaui>
    <!-- lots more here removed -->
  </PropertyGroup>
  
  <ItemGroup>
    <!-- App Icon -->
    <MauiIcon Include = "Resources\AppIcon\appicon.png" BaseSize = "48,48" Color = "#01CAFF" />
    <!-- Images -->
    <MauiImage Include = "Resources\Images\*" />
  </ItemGroup>

  <ItemGroup Condition = "'$(TargetFramework)' == 'net8.0-android'">
    <GoogleServicesJson Include = "Platforms\Android\google-services.json" />
    <PackageReference Include = "Xamarin.AndroidX.Core" Version = "1.12.0.3" />
    <PackageReference Include = "Xamarin.AndroidX.Collection" Version = "1.3.0.2" />
    <PackageReference Include = "Xamarin.AndroidX.Collection.Ktx" Version = "1.3.0.2" />
    <PackageReference Include = "Xamarin.AndroidX.Activity.Ktx" Version = "1.8.1.1" />
    <PackageReference Include = "Xamarin.Google.Android.Material" Version = "1.10.0.2" />
  </ItemGroup>
  <ItemGroup>
    <MauiImage Update = "Resources\Images\push_notification_icon.png" Resize = "false" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include = "CommunityToolkit.Maui" Version = "9.0.3" />
    <PackageReference Include = "ExifLib.Standard" Version = "1.7.0" />
    <PackageReference Include = "Microsoft.Extensions.Http" Version = "8.0.0" />
    <PackageReference Include = "Microsoft.Extensions.Http.Polly" Version = "8.0.8" />
    <PackageReference Include = "Microsoft.Extensions.Http.Resilience" Version = "8.8.0" />
    <PackageReference Include = "Plugin.Firebase" Version = "3.0.0" />
    <PackageReference Include = "Xamarin.Build.Download" Version = "0.11.4" />
  </ItemGroup>

  </ItemGroup>
  <ItemGroup>
    <None Update = "Resources\Raw\app_store_logo128x128.png">
      <Pack>True</Pack>
      <PackagePath>\</PackagePath>
    </None>
  </ItemGroup>
</Project>

У меня также, очевидно, есть файл google-services.json и приложение, созданное в консоли Firebase....

Когда я отправляю тестовое сообщение с консоли, приходит уведомление. НО, когда я проведу пальцем вниз, вы увидите, что фон значка почти белый.

Вот мой файл значка

Вот уведомление перед пролистыванием вниз. Выглядит красиво!!!

Вот мое уведомление, когда я смахиваю вниз, но значок едва виден, потому что цвет фона очень светлый:

Есть вообще идеи?????

Можете ли вы сказать мне, какое значение имеет действие сборки для файла, расположенного по адресу Platforms/Android/Resources/values/colors.xml?

liyu 28.08.2024 12:04

Действие сборки — NONE. Это должно быть что-то еще?

Mike Luken 28.08.2024 22:25

Попробуйте установить для параметра «Действие сборки» файла «color.xml» значение «AndroidResource».

liyu 29.08.2024 09:18

При использовании MAUI вы должны оставить действие сборки пустым. В зависимости от папки платформы, в которой он расположен, MAUI должен автоматически устанавливать действие сборки (отличие от Xamarin).

Mike Luken 29.08.2024 19:19

Вы можете установить действие сборки файла «colors.xml», расположенного в «Platforms/Android/Resources/values», на AndroidResource.

liyu 30.08.2024 11:53
1
5
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

До сих пор не понимаю, почему это не работает, но что-то было не так с png-файлом, который я использовал. Я создал еще один файл PNG, больше ничего не менял, и он начал работать. Понятия не имею, что было не так с первым файлом, но сейчас он работает....

Другие вопросы по теме