Я использую 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....
Когда я отправляю тестовое сообщение с консоли, приходит уведомление. НО, когда я проведу пальцем вниз, вы увидите, что фон значка почти белый.
Вот уведомление перед пролистыванием вниз. Выглядит красиво!!!
Вот мое уведомление, когда я смахиваю вниз, но значок едва виден, потому что цвет фона очень светлый:
Есть вообще идеи?????
Действие сборки — NONE. Это должно быть что-то еще?
Попробуйте установить для параметра «Действие сборки» файла «color.xml» значение «AndroidResource».
При использовании MAUI вы должны оставить действие сборки пустым. В зависимости от папки платформы, в которой он расположен, MAUI должен автоматически устанавливать действие сборки (отличие от Xamarin).
Вы можете установить действие сборки файла «colors.xml», расположенного в «Platforms/Android/Resources/values», на AndroidResource.
До сих пор не понимаю, почему это не работает, но что-то было не так с png-файлом, который я использовал. Я создал еще один файл PNG, больше ничего не менял, и он начал работать. Понятия не имею, что было не так с первым файлом, но сейчас он работает....
Можете ли вы сказать мне, какое значение имеет действие сборки для файла, расположенного по адресу Platforms/Android/Resources/values/colors.xml?