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); } };
问题分析与修复方案
关键差异点
- Flags组合不匹配:Delphi代码额外添加了
FLAG_ACTIVITY_CLEAR_TOP,而原生代码仅使用FLAG_ACTIVITY_SINGLE_TOP,该组合可能与目标Activity的栈管理逻辑冲突,导致崩溃。 - ComponentName冗余初始化:Delphi中先调用
TJComponentName.Create再重新赋值,属于冗余操作,可能引发JNI对象管理问题。 - 异常捕获不完整:仅捕获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
相关产品推荐
相关产品推荐

