You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI调用sbn.PackageName致真机App崩溃问题求助

问题:.NET MAUI中访问StatusBarNotification.PackageName导致真机崩溃

我在应用中实现了NotificationListenerService,但只要访问sbn.PackageName(代码中已注释的行),应用就会崩溃。Java里调用sbn.getPackageName()完全正常,模拟器中也能正常使用,但部署到红米Note 5 Pro和10i真机时,应用启动即崩溃。我需要获取通知所属的包名,求解决办法。

实现代码

[Service(Label = "ServiceName", Permission = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE")] 
[IntentFilter(new[] { "android.service.notification.NotificationListenerService" })] 
public class NLService : NotificationListenerService 
{ 
    public override void OnCreate() 
    { 
        base.OnCreate(); 
        Log.Info("start running", "Servico Criado"); 
    } 
    public override void OnDestroy() 
    { 
        base.OnDestroy(); 
    } 
    public override IBinder OnBind(Intent intent) 
    { 
        return base.OnBind(intent); 
    } 
    public override bool OnUnbind(Intent intent) 
    { 
        return base.OnUnbind(intent); 
    } 
    public override void OnNotificationPosted(StatusBarNotification sbn) 
    { 
        var notification= sbn.Notification; 
        Bundle extras = notification.Extras; 

        // 取消注释下面这行APP就崩溃
        // if(sbn.PackageName == "com.xyzapp"){ //Do Something }

        if (extras != null) 
        { 
            // 获取通知标题
            string title = extras.GetString(Notification.ExtraText, ""); 

            // 获取通知内容
            string content = extras.GetString(Notification.ExtraText, ""); 
            Console.WriteLine("============" + content + "======================"); 
        } 

        base.OnNotificationPosted(sbn); 
    } 

    public override void OnNotificationRemoved(StatusBarNotification sbn) 
    { 
        base.OnNotificationRemoved(sbn); 
    } 
}

错误日志片段

backtrace:
    #00 pc 000000000002216c  /system/lib64/libc.so (abort+116)
    #01 pc 0000000000039f1c  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::mono_log_handler(char const*, char const*, char const*, int, void*)+144)
    #02 pc 00000000002da9a8  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonosgen-2.0.so
    #03 pc 00000000002daad4  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonosgen-2.0.so
    #04 pc 00000000002dab18  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonosgen-2.0.so
    #05 pc 00000000000df8a8  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonosgen-2.0.so
    #06 pc 0000000000113c0c  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonosgen-2.0.so (mono_method_get_unmanaged_callers_only_ftnptr+60)
    #07 pc 0000000000026108  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::init_android_runtime(_JNIEnv*, _jclass*, _jobject*)+1320)
    #08 pc 0000000000027bac  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::create_and_initialize_domain(_JNIEnv*, _jclass*, xamarin::android::jstring_array_wrapper&, xamarin::android::jstring_array_wrapper&, _jobjectArray*, xamarin::android::jstring_array_wrapper&, _jobject*, bool, bool, bool)+160)
    #09 pc 000000000002b0f4  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::Java_mono_android_Runtime_initInternal(_JNIEnv*, _jclass*, _jstring*, _jobjectArray*, _jstring*, _jobjectArray*, int, _jobject*, _jobjectArray*, int, unsigned char, unsigned char)+4116)
    #10 pc 000000000002e5e4  /data/app/com.companyname.wmoni-AciNshhqc0_S-X8oLMzwAw==/lib/arm64/libmonodroid.so (Java_mono_android_Runtime_initInternal+88)

解决方案

1. 通过JNI直接调用Java方法绕过绑定问题

既然Java层的getPackageName()可以正常工作,我们可以直接通过JNI调用该方法获取包名,避开.NET MAUI绑定层的bug:

public override void OnNotificationPosted(StatusBarNotification sbn)
{
    var notification = sbn.Notification;
    Bundle extras = notification.Extras;

    // 通过JNI获取包名
    string packageName = string.Empty;
    using (var jniEnv = JNIEnv.GetEnv())
    {
        var sbnJObject = sbn.Handle;
        var methodId = jniEnv.GetMethodID(jniEnv.GetObjectClass(sbnJObject), "getPackageName", "()Ljava/lang/String;");
        var packageNameJString = jniEnv.CallObjectMethod(sbnJObject, methodId);
        packageName = JNIEnv.GetString(packageNameJString);
        jniEnv.DeleteLocalRef(packageNameJString);
    }

    if(packageName == "com.xyzapp"){ 
        // 执行你的业务逻辑
    }

    if (extras != null)
    {
        // 注意:原代码中标题和内容都用了ExtraText,这里修正为正确的常量
        string title = extras.GetString(Notification.ExtraTitle, "");
        string content = extras.GetString(Notification.ExtraText, "");
        Console.WriteLine("============" + content + "======================");
    }

    base.OnNotificationPosted(sbn);
}

2. 更新.NET MAUI版本

这个问题大概率是特定版本的绑定bug,尝试更新到最新稳定版的.NET MAUI,官方可能已经修复了该问题。

3. 验证权限配置

确保应用已正确获取通知监听权限:

  • 确认AndroidManifest.xml中已添加BIND_NOTIFICATION_LISTENER_SERVICE权限
  • 引导用户到系统设置中启用你的应用的通知访问权限

内容的提问来源于stack exchange,提问作者user1066231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:45:55