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

Delphi 10.4 FireMonkey调用外部App Activity崩溃问题求助

Delphi FireMonkey调用外部Android Activity崩溃问题修复

问题背景

使用Delphi 10.4 FireMonkey开发Android应用,需调用外部Appcom.ksnet.kscat_a中的PaymentIntentActivity,参考可正常运行的Android原生代码实现后,调用时应用直接崩溃,调试模式下进程终止,调整Manifest配置和代码参数后仍未解决,核心需求是通过FLAG_ACTIVITY_SINGLE_TOP实现与外部App的一体化调用。

现有代码对比

本人的Delphi代码

procedure TForm6.Button1Click(Sender: TObject);
var
  Intent: JIntent;
  PackageManager : JPackageManager;
  ComponentName : JComponentName;
  ResolveInfo : JResolveInfo;
  stelegram : String;
begin
  stelegram := '010101';
  Intent := TJIntent.Create;
  ComponentName := TJComponentName.Create;
  try
    ComponentName := TJComponentName.JavaClass.init( StringToJString('com.ksnet.kscat_a'), StringToJString('com.ksnet.kscat_a.PaymentIntentActivity') );
    if ComponentName <> nil then
    begin
    Intent.SetAction( TJIntent.JavaClass.ACTION_MAIN );
    Intent.SetFlags( TJIntent.JavaClass.FLAG_ACTIVITY_SINGLE_TOP or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP   );
    Intent.AddCategory( TJIntent.JavaClass.CATEGORY_LAUNCHER );
    Intent.SetComponent( ComponentName );
    Intent.PutExtra('Telegram', StringToJString( sTelegram ) );
    Intent.PutExtra('TelegramLength', Length( sTelegram ) );

    if MainActivity.getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then
    begin
      SharedActivity.startActivityForResult(Intent,1);  
    end
    else
      memo1.Lines.Add('INTENT 1 Faile');
    end;
  Except
  on e: Exception do
    begin
      Memo1.Lines.Add( E.Message );
    end;
  end;

end;

参考的Android原生代码

// IC Approval ( android sample source )
Button.OnClickListener btn1OnClickListener = new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
        EditText et = findViewById(R.id.spet1);
        mDeviceNo = et.getText().toString();
        makeTelegramIC("1");
        // makeTelegramVANTR();
        ComponentName componentName = new ComponentName("com.ksnet.kscat_a","com.ksnet.kscat_a.PaymentIntentActivity");
        mIntent = new Intent(Intent.ACTION_MAIN);
        mIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        mIntent.setComponent(componentName);
        mIntent.putExtra("Telegram", mRequestTelegram);
        mIntent.putExtra("TelegramLength", mRequestTelegram.length);
        startActivityForResult(mIntent, 0);

        TextView tv = findViewById(R.id.cardsvtv1);
        String str = Util.HexDump.dumpHexString(mRequestTelegram);
        tv.setText(str);
    }
};

问题分析与修复方案

关键差异点

  1. Flags组合不匹配:Delphi代码额外添加了FLAG_ACTIVITY_CLEAR_TOP,而原生代码仅使用FLAG_ACTIVITY_SINGLE_TOP,该组合可能与目标Activity的栈管理逻辑冲突,导致崩溃。
  2. ComponentName冗余初始化:Delphi中先调用TJComponentName.Create再重新赋值,属于冗余操作,可能引发JNI对象管理问题。
  3. 异常捕获不完整:仅捕获Delphi层异常,未处理JNI层的原生异常,无法获取崩溃的具体原因。

修改后的Delphi代码

procedure TForm6.Button1Click(Sender: TObject);
var
  Intent: JIntent;
  ComponentName : JComponentName;
  sTelegram : String;
  PM: JPackageManager;
  ResolveList: JList;
begin
  sTelegram := '010101';
  Intent := TJIntent.Create;
  try
    // 直接初始化ComponentName,避免冗余创建
    ComponentName := TJComponentName.JavaClass.init(StringToJString('com.ksnet.kscat_a'), 
      StringToJString('com.ksnet.kscat_a.PaymentIntentActivity'));
    
    Intent.SetAction(TJIntent.JavaClass.ACTION_MAIN);
    // 与原生代码保持一致,仅保留FLAG_ACTIVITY_SINGLE_TOP
    Intent.SetFlags(TJIntent.JavaClass.FLAG_ACTIVITY_SINGLE_TOP);
    Intent.AddCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
    Intent.SetComponent(ComponentName);
    Intent.PutExtra(StringToJString('Telegram'), StringToJString(sTelegram));
    // 确保参数类型与原生一致
    Intent.PutExtra(StringToJString('TelegramLength'), Length(sTelegram));

    PM := SharedActivity.getPackageManager;
    ResolveList := PM.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY);
    if ResolveList.size > 0 then
    begin
      try
        SharedActivity.startActivityForResult(Intent, 1);
      except
        on E: Exception do
        begin
          Memo1.Lines.Add('启动异常: ' + E.Message);
          // 获取JNI层的详细错误信息
          if Assigned(GetJNIException) then
            Memo1.Lines.Add('JNI异常详情: ' + JStringToString(TJThrowable.JavaClass.getMessage(GetJNIException)));
        end;
      end;
    end
    else
      Memo1.Lines.Add('未找到可处理该Intent的Activity');
  except
    on E: Exception do
      Memo1.Lines.Add('初始化异常: ' + E.Message);
  end;
end;

额外排查步骤

  • 配置AndroidManifest.xml(Android 11+):添加<queries>标签以允许查询目标App,否则会因包可见性限制无法找到目标Activity:
    <queries>
      <package android:name="com.ksnet.kscat_a" />
    </queries>
    
  • 确认目标Activity的导出属性:目标App的PaymentIntentActivity需在Manifest中设置android:exported="true",否则外部App无法调用。
  • 查看Logcat日志:使用Android Studio的Logcat工具,过滤你的App包名和com.ksnet.kscat_a,获取崩溃的具体堆栈信息,定位核心问题(如权限不足、参数类型不匹配等)。
  • 尝试移除不必要的Category:若目标Activity不强制要求CATEGORY_LAUNCHER,可尝试删除Intent.AddCategory调用,部分Activity可能对类别有严格限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:27:04