当前位置: 首页 > 知识库问答 >
问题:

当应用程序被滑动关闭时,没有收到Xamarin Forms Android推送通知

耿运浩
2023-03-14

去年我在Xamarin Forms应用程序中配置了推送通知,本周我决定更新到新的SDK,在iOS上这是一帆风顺的,但在Android上我遇到了问题。

我试图在这里复制文档:https://docs.microsoft.com/en-us/azure/notification-hubs/xamarin-notification-hubs-push-notifications-android-gcm 并相信我是90%的方式,因为我的应用程序在前台和后台时会很乐意接收推送通知,但是我的应用程序在被滑动关闭(而不是强制关闭)时无法接收推送通知。我知道这是100%不是设备问题,因为我使用FirebaseService类测试了旧配置,并且它工作正常。我还在使用“数据”通知。

当发送推送通知时,我能够在设备日志中找到以下错误消息:“错误(6621)/AndroidRuntime:java.lang.NullPointerException:尝试调用接口方法'void com.microsoft.windowsazure.messaging.notificationhubs.NotifictionListener.onPushNotificationReceived(android.content.Context,com.microsoft.windowsazure.messaging.notificationhubs.NotifictionMessage)“在空对象引用上”

请参阅下面我的Mainactive类的代码。

[Activity(Label = "AndroidNotificationTest", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        internal static readonly string CHANNEL_ID = "my_notification_channel";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            // Listen for push notifications
            NotificationHub.SetListener(new AzureListener());

            // Start the SDK
            NotificationHub.Start(this.Application, Constants.NotificationHubName, Constants.ListenConnectionString);
            NotificationHub.AddTag("Developer");

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());

            CreateNotificationChannel();
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        void CreateNotificationChannel()
        {
            if (Build.VERSION.SdkInt < BuildVersionCodes.O)
                return;

            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default)
            {
                Description = "Firebase Cloud Messages appear in this channel"
            };

            NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.CreateNotificationChannel(channel);
        }
    }

    internal class AzureListener : Java.Lang.Object, INotificationListener
    {
        public void OnPushNotificationReceived(Context context, INotificationMessage message)
        {
            Console.WriteLine($"Message received with title {message.Title} and body {message.Body}");
        }
    }

和我的Android清单文件。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.package.appname">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <application android:label="AndroidNotificationTest.Android" android:theme="@style/MainTheme"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

我花了好几天的时间来研究这个问题,但我在现阶段还不明白问题出在哪里。

共有1个答案

丰赞
2023-03-14

也许我的工作代码可以帮助你。

我在使用 AzureListener 类编写新文档之前编写了此代码,但它仍然有效。

Xamarin 表单:推送通知在 Android 7.1.2 上不起作用

        //if i want more than one notification ,different unique value in every call
    Random u = new Random ();

    if (Build.VERSION.SdkInt >= BuildVersionCodes.O) {

        string channelName = Resources.GetString (Resource.String.channel_name);

        NotificationCompat.Builder notificationBuilder;



             notificationBuilder = new NotificationCompat.Builder (this, channelName)
                    .SetContentTitle (title)
                    .SetSmallIcon (Resource.Drawable.ic_stat_g)
                    .SetContentText (messageBody)
                    .SetAutoCancel (true)
                    .SetContentIntent (pendingIntent);


        var notificationManager = GetSystemService (Context.NotificationService) as NotificationManager;


        NotificationChannel channel = new NotificationChannel (channelName, "notification channel", NotificationImportance.Default);
        notificationManager.CreateNotificationChannel (channel);

        notificationManager.Notify (u.Next(), notificationBuilder.Build ());


    } 
    else
    {

        NotificationCompat.Builder notificationBuilder;


             notificationBuilder = new NotificationCompat.Builder (this)
                .SetContentTitle (title)
                .SetSmallIcon (Resource.Drawable.ic_stat_g)
                .SetContentText (messageBody)
                .SetAutoCancel (true)
                .SetContentIntent (pendingIntent);


        var notificationManager = GetSystemService (Context.NotificationService) as NotificationManager;

        notificationManager.Notify (u.Next(), notificationBuilder.Build ());
    }
 类似资料:
  • 我目前正在开发Android(Cordova)应用程序,我正在使用Oneignal推送通知。首先,如果我关闭应用程序,推送通知不会被传递,所以我不得不添加一个Cordova插件来保持我的应用程序在后台运行: 我在deviceready之后的代码: 谢了。

  • 我想用Xamarin格式的C#创建一个基于文本的Android游戏。 在故事中,我想设置角色任务,这需要一些时间,例如“我去挖这个洞,完成后给你打电话。” 如何将通知设置为在设置的时间之后显示?例如,上述声明可能需要10分钟,然后用户收到继续游戏的通知? 我一周前才开始做C#,所以如果这是noobish,或者已经被问到了,我道歉。我到处都找过,但有几种类型的通知,当我试图理解它时,似乎我在读法语。

  • 当应用程序完全关闭时,如何以编程方式发送通知? 示例:用户关闭应用程序,也在Android Taskmanager中,然后等待。应用程序应在X秒后或应用程序检查更新时发送通知。 我试图使用这些代码示例,但是: 应用程序关闭时推送通知-活动太多/无法工作 我如何让我的应用程序在关闭时发送通知很多信息,但我不知道如何处理 当android应用程序关闭时,如何发送本地通知?-很多信息,但我不知道如何处理

  • null 我还试了一下: 关闭应用程序进程-&>;关闭设备-&>;打开设备电源-&>;发送通知。。。并且没有收到通知! 看起来firebase只有在设备启动了应用程序而不是100%关闭的情况下才能收到通知,我的意思是,只需用后退键关闭它而不是关闭应用程序进程。 这怎么可能呢?据推测,即使应用程序关闭,firebase也应该收到通知。 我正在Nexus5X和Android 8.0上进行测试,我使用的

  • 当app不再活动(即使是最近的任务)时,如何从FCM接收推送通知。我看到gmail、whatsapp都有这个功能。我正在使用FCM进行推送通知。我使用了WakefulBroadcast接收器来唤醒设备。我怎么用这个? 服务类别:

  • 我正在开发一个电子邮件应用程序,我希望用户在收到新电子邮件后立即收到推送通知。为此,我使用FCM。我刚刚通过以下链接尝试使用FCM推送通知:https://www.youtube.com/watch?v=XijS62iP1Xo 感谢每一种帮助。提前感谢。