xamarin C#中的PendingIntent.GetBroadcast不允许我创建通知

flmtquvp  于 2023-06-20  发布在  C#
关注(0)|答案(1)|浏览(128)

我目前正在尝试使用Xamarin在Visual Studio中创建通知,但我在使用Android应用程序时遇到了问题。
这是连接到通知接收方的通知服务类,然后应在一定的秒数后发送通知。问题是,带有pendingIntent.GetBroadcast的那行代码总是在其运行轨道上停止代码。没有出现错误消息,所以我不知道为什么这一行是不正确的。
有没有人能给点建议或指出哪里出了问题?或者干脆放弃这种做法,尝试一种新的方法。
我很乐意提供任何进一步的信息,以帮助确定什么是错误的。WriteLine命令只是用来查看代码执行了多少,它的作用是“Testing2”

using System;
using System.Runtime.Remoting.Contexts;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Support.V4.App;
using WCDP_FMRS.Services;
using Context = Android.Content.Context;

namespace WCDP_FMRS.Droid.Services
{
    // Implement the INotificationService for Android
    public class AndroidNotificationService : INotificationService
    {
        public void ScheduleNotification(string title, string message, int seconds)
        {

            Console.WriteLine("Testing 1");

            var alarmIntent = new Intent(Application.Context, typeof(AndroidNotificationReceiver));
            var notifyTime = DateTime.Now.AddSeconds(seconds);
            alarmIntent.PutExtra("title", title);
            alarmIntent.PutExtra("message", message);

            Console.WriteLine("Testing 2");

            **var pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);**
            var alarmManager = Application.Context.GetSystemService(Context.AlarmService) as AlarmManager;

            Console.WriteLine("Testing 2.5");

            if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
            {
                alarmManager.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, notifyTime.ToLocalTime().Ticks / 10000, pendingIntent);
                Console.WriteLine("Testing 3");
            }
            else if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
            {
                alarmManager.SetExact(AlarmType.RtcWakeup, notifyTime.ToLocalTime().Ticks / 10000, pendingIntent);
                Console.WriteLine("Testing 4");
            }
            else
            {
                alarmManager.Set(AlarmType.RtcWakeup, notifyTime.ToLocalTime().Ticks / 10000, pendingIntent);
                Console.WriteLine("Testing 5");
            }

            Console.WriteLine("Testing 6");

        }

        public void RequestAuthorization()
        {

            NotificationChannelHelper.CreateNotificationChannel(Application.Context);

        }
    }
}
b91juud3

b91juud31#

从PendingIntent.FLAG_MUTABLE的文档中,我们知道:
Build.VERSION_CODES.R之前,默认情况下PendingIntents是可变的,除非设置了FLAG_IMMUTABLE。从Build.VERSION_CODES.S开始,需要在创建时使用(@link #FLAG_IMMUTABLE}或FLAG_MUTABLE显式指定PendingIntents的可变性。强烈建议在创建PendingIntent时使用FLAG_IMMUTABLEFLAG_MUTABLE仅应在某些功能依赖于修改底层意图时使用,例如任何需要与内联回复或气泡一起使用的PendingIntent
所以,你可以尝试替换代码:

var pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);

其中:

var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S) 
                ? PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Mutable
                : PendingIntentFlags.UpdateCurrent;

 var pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, resultIntent, pendingIntentFlags);

相关问题