.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
相关产品推荐
相关产品推荐

