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

Delphi 11开发Android应用时如何实现推送通知权限请求

Delphi 11开发Android应用时如何实现推送通知权限请求

我来帮你梳理下可能的问题和解决办法,你遇到的权限请求不弹出的情况,在Delphi 11开发Android应用时其实挺常见的,咱们一步步排查和解决:

  • 确认Android版本适配:POST_NOTIFICATIONS权限是Android 13(API 33)才新增的权限,所以首先要确保你的项目目标SDK版本设置为33及以上。你可以打开Project Options > Application > Target Platforms > Android > Version Info,检查Target SDK Version是否是33或更高版本。低版本Android不需要这个权限,也就不会弹出请求框。

  • 检查AndroidManifest.xml配置:虽然Delphi的权限服务会自动处理部分配置,但有时候还是要手动确认权限声明是否存在。你可以在Project > Deployment里找到AndroidManifest.xml,打开后确认里面有这一行:

    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    

    如果没有,手动添加进去再重新编译项目。

  • 调整权限请求的时机:别在应用启动的最早期(比如FormCreate事件)就调用权限请求,这时候应用可能还没完全初始化,系统大概率不会弹出请求框。建议把请求放在用户交互触发的事件里,比如按钮的OnClick事件,或者在FormShow里延迟几百毫秒执行(比如用TTimer)。

  • 确认权限服务可用:在调用请求前先检查PermissionsService是否初始化成功,避免因为服务未就绪导致请求失效,代码可以这么写:

    if Assigned(PermissionsService) then
    begin
      // 执行权限请求逻辑
    end
    else
      ShowMessage('权限服务不可用,请检查项目配置');
    
  • 验证Entitlement配置:你已经开启了“Receive Push Notification”,但可以尝试先Clean项目(Project > Clean),再重新Build,确保配置同步到项目中。有时候Delphi的配置文件可能没有及时更新,Clean后重新编译能解决这类问题。

给你一个优化后的完整代码示例,放在按钮点击事件里更稳妥:

procedure TForm1.btnRequestPushPermissionClick(Sender: TObject);
begin
  // 只在Android 13及以上版本请求权限
  if TOSVersion.Check(13) then
  begin
    if Assigned(PermissionsService) then
    begin
      PermissionsService.RequestPermissions(
        ['android.permission.POST_NOTIFICATIONS'],
        procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
        begin
          if Length(AGrantResults) > 0 then
          begin
            if AGrantResults[0] = TPermissionStatus.Granted then
              ShowMessage('推送通知权限已成功授予')
            else
            begin
              ShowMessage('推送通知权限被拒绝,你可以到应用设置里手动开启');
              // 引导用户跳转到应用设置页面
              PermissionsService.OpenSettings;
            end;
          end;
        end
      );
    end
    else
      ShowMessage('权限服务未初始化,请检查项目配置');
  end
  else
    ShowMessage('当前Android版本无需申请推送通知权限');
end;

另外要注意:如果用户第一次拒绝了权限,后续再调用请求时系统不会再弹出对话框,这时候就需要引导用户到应用设置里手动开启权限,上面的代码里也加了跳转到设置的逻辑。

备注:内容来源于stack exchange,提问作者Velson Infotech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:07:58