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;
关键修正点:
- 直接使用
TJavaObjectArray<JParcelable>存储App配置Bundle,避免跨类型强制转换 - 通过
TJParcelableArray.Wrap(bAppList.ObjectID)将Delphi管理的Java数组转为Android原生的ParcelableArray,这是DataWedge能正确解析的核心 - 建议使用官方的
TAndroidHelper.StringToJString而非自定义转换函数,减少隐式错误
内容的提问来源于stack exchange,提问作者user2244705
相关产品推荐
相关产品推荐

