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

Java Parcelable数组转Delphi数组调用DataWedge API遇问题

问题:Delphi转换DataWedge API代码后APP_LIST无法被识别

我正在将Zebra DataWedge API的Java示例代码转为Delphi代码,实现Zebra终端扫码数据接收功能。其他配置参数都能正常生效,但APP_LIST对应的Parcelable数组始终无法在DataWedge中创建成功。

Java示例代码

// CREATE APP_LIST BUNDLES (apps and/or activities to be associated with the Profile)
Bundle bundleApp1 = new Bundle();
bundleApp1.putString("PACKAGE_NAME","com.symbol.emdk.simulscansample1");
bundleApp1.putStringArray("ACTIVITY_LIST", new String[]{
        "com.symbol.emdk.simulscansample1.DeviceControl",
        "com.symbol.emdk.simulscansample1.MainActivity",
        "com.symbol.emdk.simulscansample1.ResultsActivity.*",
        "com.symbol.emdk.simulscansample1.ResultsActivity2",
        "com.symbol.emdk.simulscansample1.SettingsFragment1"});

Bundle bundleApp2 = new Bundle();
bundleApp2.putString("PACKAGE_NAME","com.example.intents.datawedgeintent");
bundleApp2.putStringArray("ACTIVITY_LIST", new String[]{
        "com.example.intents.datawedgeintent.DeviceControl",
        "com.example.intents.datawedgeintent.MainActivity",
        "com.example.intents.datawedgeintent.ResultsActivity",
        "com.example.intents.datawedgeintent.SettingsFragment1"});
// NEXT APP_LIST BUNDLE(S) INTO THE MAIN BUNDLE
bMain.putParcelableArray("APP_LIST", new Bundle[]{
        bundleApp1
        ,bundleApp2
});

Intent i = new Intent();
i.setAction("com.symbol.datawedge.api.ACTION");
i.putExtra("com.symbol.datawedge.api.SET_CONFIG", bMain);

this.sendBroadcast(i);

我的Delphi代码(尝试过多种类型转换仍无效)

// Variables declarations
var activitiesList : TJavaObjectArray<JString>;
    iSetConfig: JIntent;
    bMain : JBundle;
    bApp : JBundle;
    bAppList : TJavaObjectArray<JBundle>;
    // Also tried that
    // bAppList : TJavaObjectArray<JParcelable>;
begin
  // Application
  activitiesList := TJavaObjectArray<JString>.Create(1);
  // "j" function converts Delphi string to Java String
  // like this jStr := TAndroidHelper.StringToJString(dStr)
  // just making the code more readable
  activitiesList.Items[0] := j('*');
  bApp := TJBundle.Create;
  bApp.putString(j('PACKAGE_NAME'),j('my.application.test'));
  bApp.putStringArray(j('ACTIVITY_LIST'), activitiesList);

  bAppList := TJavaObjectArray<JBundle>.create(1);
  // Also tried that
  // bAppList := TJavaObjectArray<JParcelable>.create(1);
  bAppList.Items[0] := bApp;
  // Also tried that
  // bAppList.Items[0] := JParcelable(bApp);
  bMain := TJBundle.Create;
  bMain.putString(j('CONFIG_MODE'),j('UPDATE'));
  bMain.putString(j('PROFILE_NAME'),j('test'));
  bMain.putString(j('RESET_CONFIG'), j('true'));
  bMain.putString(j('PROFILE_ENABLED'),j('true'));
  bMain.putParcelableArray(j('APP_LIST'),TJavaObjectArray<JParcelable>(bAppList));
  // Also tried that
  // bMain.putParcelableArray(j('APP_LIST'),bAppList);

  iSetConfig := TJIntent.Create;
  iSetConfig.setAction(j('com.symbol.datawedge.api.ACTION'));
  iSetConfig.putExtra(j('com.symbol.datawedge.api.SET_CONFIG'),bMain);
  TAndroidHelper.Context.sendBroadcast(iSetConfig);
end;

解决方案

问题出在Delphi数组到Android原生ParcelableArray的转换上,DataWedge无法识别强制转换后的数组类型。以下是修正后的代码:

var
  activitiesList: TJavaObjectArray<JString>;
  iSetConfig: JIntent;
  bMain, bApp: JBundle;
  bAppList: TJavaObjectArray<JParcelable>;
begin
  // 初始化Activity列表
  activitiesList := TJavaObjectArray<JString>.Create(1);
  activitiesList.Items[0] := TAndroidHelper.StringToJString('*');

  // 创建单个App配置Bundle
  bApp := TJBundle.Create;
  bApp.putString(TAndroidHelper.StringToJString('PACKAGE_NAME'), 
                 TAndroidHelper.StringToJString('my.application.test'));
  bApp.putStringArray(TAndroidHelper.StringToJString('ACTIVITY_LIST'), activitiesList);

  // 创建Parcelable数组存放App配置(Bundle实现了Parcelable接口)
  bAppList := TJavaObjectArray<JParcelable>.Create(1);
  bAppList.Items[0] := JParcelable(bApp);

  // 主配置Bundle
  bMain := TJBundle.Create;
  bMain.putString(TAndroidHelper.StringToJString('CONFIG_MODE'), 
                  TAndroidHelper.StringToJString('UPDATE'));
  bMain.putString(TAndroidHelper.StringToJString('PROFILE_NAME'), 
                  TAndroidHelper.StringToJString('test'));
  bMain.putString(TAndroidHelper.StringToJString('RESET_CONFIG'), 
                  TAndroidHelper.StringToJString('true'));
  bMain.putString(TAndroidHelper.StringToJString('PROFILE_ENABLED'), 
                  TAndroidHelper.StringToJString('true'));
  
  // 关键:将Delphi的Java数组转为Android原生ParcelableArray
  bMain.putParcelableArray(TAndroidHelper.StringToJString('APP_LIST'), 
                           TJParcelableArray.Wrap(bAppList.ObjectID));

  // 发送广播
  iSetConfig := TJIntent.Create;
  iSetConfig.setAction(TAndroidHelper.StringToJString('com.symbol.datawedge.api.ACTION'));
  iSetConfig.putExtra(TAndroidHelper.StringToJString('com.symbol.datawedge.api.SET_CONFIG'), bMain);
  TAndroidHelper.Context.sendBroadcast(iSetConfig);
end;

关键修正点:

  1. 直接使用TJavaObjectArray<JParcelable>存储App配置Bundle,避免跨类型强制转换
  2. 通过TJParcelableArray.Wrap(bAppList.ObjectID)将Delphi管理的Java数组转为Android原生的ParcelableArray,这是DataWedge能正确解析的核心
  3. 建议使用官方的TAndroidHelper.StringToJString而非自定义转换函数,减少隐式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:37:03