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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:34:12