13 changed files with 206 additions and 41 deletions
@ -0,0 +1,81 @@ |
|||
using Android.App; |
|||
using Android.Content; |
|||
using Android.OS; |
|||
using AndroidX.Core.App; |
|||
using SunlightAggregationTerminal; |
|||
// 使用 global:: 强制指定原生安卓的命名空间
|
|||
using AndroidApp = global::Android.App; |
|||
|
|||
namespace SunlightAggregationTerminal.Platforms.Android |
|||
{ |
|||
public class NotificationService : INotificationService |
|||
{ |
|||
const string channelId = "default_channel"; |
|||
const string channelName = "Default Notifications"; |
|||
const string channelDescription = "Default notification channel"; |
|||
|
|||
public void SendNotification(string title, string message, int notificationId = 0) |
|||
{ |
|||
// 1. 创建通知渠道(仅 Android 8.0 / API 26 及以上需要)
|
|||
#pragma warning disable CA1416 // 暂时关闭平台兼容性警告
|
|||
if (Build.VERSION.SdkInt >= BuildVersionCodes.O) |
|||
{ |
|||
var channel = new AndroidApp.NotificationChannel(channelId, channelName, NotificationImportance.Default) |
|||
{ |
|||
Description = channelDescription |
|||
}; |
|||
|
|||
// 修复点:获取系统服务并处理可能的 null 值
|
|||
// 如果 GetSystemService 返回 null,则直接 return 终止方法,防止后续崩溃
|
|||
var notificationManager = AndroidApp.Application.Context.GetSystemService(Context.NotificationService) as AndroidApp.NotificationManager; |
|||
if (notificationManager == null) return; |
|||
|
|||
notificationManager.CreateNotificationChannel(channel); |
|||
} |
|||
#pragma warning restore CA1416 // 恢复平台兼容性警告
|
|||
|
|||
// 2. 构建通知内容
|
|||
var intent = new Intent(AndroidApp.Application.Context, typeof(MainActivity)); |
|||
intent.AddFlags(ActivityFlags.ClearTop); |
|||
|
|||
#pragma warning disable CA1416
|
|||
// PendingIntent 同样建议做安全获取
|
|||
var pendingIntent = PendingIntent.GetActivity(AndroidApp.Application.Context, 0, intent, PendingIntentFlags.Immutable | PendingIntentFlags.UpdateCurrent); |
|||
#pragma warning restore CA1416 // 恢复平台兼容性警告
|
|||
|
|||
NotificationCompat.Builder notificationBuilder; |
|||
|
|||
// 核心兼容处理:根据系统版本选择不同的 Builder 构造方法
|
|||
if (Build.VERSION.SdkInt >= BuildVersionCodes.O) |
|||
{ |
|||
// Android 8.0+:必须传入 channelId
|
|||
notificationBuilder = new NotificationCompat.Builder(AndroidApp.Application.Context, channelId); |
|||
} |
|||
else |
|||
{ |
|||
#pragma warning disable CS0618
|
|||
// Android 5.0 ~ 7.x:不支持 channelId,使用旧版单参数构造方法
|
|||
notificationBuilder = new NotificationCompat.Builder(AndroidApp.Application.Context); |
|||
#pragma warning restore CS0618
|
|||
} |
|||
|
|||
var notification = notificationBuilder! |
|||
.SetContentTitle(title)! |
|||
.SetContentText(message)! |
|||
// 请确保你的 Resources/drawable 文件夹下有这个图标
|
|||
//.SetSmallIcon(Resource.Drawable.abc_vector_test)!
|
|||
.SetAutoCancel(true)! |
|||
.SetContentIntent(pendingIntent); |
|||
|
|||
// 如果是 Android 5.0 (API 21) 及以上,还可以设置锁屏可见等特性
|
|||
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) |
|||
{ |
|||
notification!.SetVisibility(NotificationCompat.VisibilityPublic); |
|||
} |
|||
|
|||
// 3. 发送通知
|
|||
var compatManager = NotificationManagerCompat.From(AndroidApp.Application.Context); |
|||
compatManager!.Notify(notificationId, notification!.Build()); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Text; |
|||
|
|||
namespace SunlightAggregationTerminal |
|||
{ |
|||
public interface INotificationService |
|||
{ |
|||
void SendNotification(string title, string message, int notificationId = 0); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue