Delphi 10.2.2 Tokyo AndroidService创建通知触发段错误11求助
解决Delphi 10.2.2 AndroidService调用CreateNotification触发段错误11的问题
我帮你梳理了几个针对这个问题的排查和解决方向,结合你提到的Delphi版本、Android设备和Bass库使用场景,应该能帮你解决这个段错误:
1. 调整通知创建的线程与时机
Delphi的Android Service在onStartCommandNative阶段,RTL的上下文初始化可能还未完成,直接调用CreateNotification很容易触发内存访问错误。
- 建议把通知创建逻辑延迟到Service的
OnCreate事件后,并且通过主线程调度执行:
procedure TMyAndroidService.ServiceCreate(Sender: TObject); begin TThread.Synchronize(nil, procedure begin // 在这里执行你的CreateNotification逻辑 CreateNotification('通知标题', '通知内容', nil); end); end;
2. 适配Android 6.0的权限要求
Android 6.0(API 23)开始的权限机制可能间接影响通知功能,尤其是你的项目还用到了Bass音频库:
- 先在
AndroidManifest.xml中补全必要权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Bass音频相关权限,如果用到音频功能请添加 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
- 对于Android 6.0+设备,在App启动时主动请求动态权限,避免权限缺失导致RTL底层调用异常。
3. 隔离Bass库与Delphi RTL的线程冲突
Bass作为Native库,其线程上下文可能和Delphi的FMX/VCL通知API不兼容,尤其是在Service的Native线程中调用通知功能:
- 暂时移除Bass相关代码,单独测试通知创建逻辑,如果错误消失,说明是两者的冲突问题。此时需要将Bass的操作和通知操作隔离在不同线程执行,或者调整Bass的初始化时机(比如放到Service创建后的主线程中)。
4. 绕过Delphi RTL的通知API,直接调用Android原生API
Delphi 10.2.2的System.Notification模块存在已知的Service场景Bug,你可以直接调用Android的Java API创建通知来绕过这个问题:
uses Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure TMyAndroidService.CreateCustomNotification; var Builder: JNotificationBuilder; Notification: JNotification; NotifManager: JNotificationManager; begin Builder := TJNotificationBuilder.JavaClass.init(TAndroidHelper.Context); Builder.setContentTitle(StringToJString('Service通知')); Builder.setContentText(StringToJString('这是来自后台服务的通知')); Builder.setSmallIcon(TAndroidHelper.Context.getApplicationInfo.icon); Notification := Builder.build; NotifManager := TJNotificationManager.Wrap( TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE)); NotifManager.notify(1001, Notification); end;
5. 升级Delphi补丁或调试定位细节
- Delphi 10.2.2的Update 4补丁修复了不少Android Service和通知相关的崩溃问题,建议安装该版本的最新补丁。
- 启用Delphi的LogCat调试,查看崩溃时的完整堆栈信息,能更精准定位
System.Notification中触发段错误的具体函数。
内容的提问来源于stack exchange,提问作者El Diablo
相关产品推荐
相关产品推荐

