Jump to content

krucifix

Members
  • Content Count

    4
  • Joined

  • Last visited

Community Reputation

0 Neutral
  1. krucifix

    Android payment terminal

    Knew it will be simple...... Task for tomorrow...
  2. krucifix

    Android payment terminal

    type TMyServiceConnection = class(TInterfacedObject, JServiceConnection) public procedure onServiceConnected(componentName: JComponentName; Binder: JIBinder)cdecl; procedure onServiceDisconnected(componentName: JComponentName)cdecl; procedure onBindingDied(componentName: JComponentName)cdecl; end; type TfmPostTest = class(TForm) Header: TToolBar; Footer: TToolBar; HeaderLabel: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private function IspisiracunTest: string; { Private declarations } public { Public declarations } end; const AIDL_ACTION = 'rs.asoft.asoftposandroid.util.service.AIDL'; AIDL_PACKAGE = 'rs.asoft.asoftposandroid'; DynamicReportprint = '114'; var Common: JIAsoftPOS; ServiceConnection: TMyServiceConnection; var fmPostTest: TfmPostTest; implementation uses ASoftPosPrinter; procedure TMyServiceConnection.onServiceConnected(componentName: JComponentName; Binder: JIBinder); begin Common := TJIAsoftPOS.Wrap((ServiceConnection as ILocalObject).GetObjectID); end; procedure TMyServiceConnection.onServiceDisconnected(componentName: JComponentName); begin end; procedure TMyServiceConnection.onBindingDied(componentName: JComponentName); begin end; {$R *.fmx} function StringToJA(Data: String; charset: String = ''): TJavaArray<Byte>; var Encoding: TEncoding; Arr: TBytes; len: Integer; begin if charset <> '' then Encoding := TEncoding.GetEncoding(charset) else Encoding := TEncoding.Default; Arr := Encoding.GetBytes(Data); len := length(Arr); Result := TJavaArray<Byte>.Create(len); if len > 0 then Move(Arr[0], Result.Data^, len); end; procedure TfmPostTest.Button1Click(Sender: TObject); Var Intent: JIntent; Response: TJavaArray<Byte>; sendCommand: string; i: Integer; ExplicitIntent: JIntent; begin Intent := TJIntent.Create; ServiceConnection := TMyServiceConnection.Create(); try Intent.setAction(StringToJString(AIDL_ACTION)); Intent.setPackage(StringToJString(AIDL_PACKAGE)); ExplicitIntent := TAndroidHelper.Context.getPackageManager.getLaunchIntentForPackage(StringToJString(AIDL_PACKAGE)); if ExplicitIntent <> nil then begin ExplicitIntent.setAction(StringToJString(AIDL_ACTION)); // ExplicitIntent.setPackage(StringToJString(AIDL_PACKAGE)); ?? hm ExplicitIntent.setData(Intent.getData); TAndroidHelper.Context.bindService(ExplicitIntent, ServiceConnection, TJContext.JavaClass.BIND_AUTO_CREATE); TAndroidHelper.Context.startActivity(ExplicitIntent); Response := Common.messageExchange(StringToJA(IspisiracunTest)); if Response <> nil then for i := 0 to Response.length - 1 do sendCommand := sendCommand + IntToHex(Response[i]); ShowMessage(sendCommand); end; finally ServiceConnection.Free; end; end; Tx for looking
  3. krucifix

    Android payment terminal

    Tx mjustin. Created classes and that part is working now. Now getting EJNIFatal with message 'Fatal error invoking interface' at TAndroidHelper.Context.bindService(ConvertImplicitIntentToExplicitIntent(Intent), ServiceConnection, TJContext.JavaClass.BIND_AUTO_CREATE); Investigating...
  4. krucifix

    Android payment terminal

    I'm developing POS app which will be used on A920 payment terminal. Vendor supplied jar file and I used java2op and generated bridge file. Documentation have android example public static final String AIDL_ACTION = "rs.asoft.asoftposandroid.util.service.AIDL"; public static final String AIDL_PACKAGE = "rs.asoft.asoftposandroid"; private IAsoftPOS common; private ServiceConnection serviceConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { common = IAsoftPOS.Stub.asInterface(service); Log.d("ServiceConnection", "Successful connection"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d("ServiceConnection", "The connection has been lost"); } }; //The implicit Intent must be converted to the explicit: private Intent convertImplicitIntentToExplicitIntent(Intent implicitIntent) { PackageManager pm = getPackageManager(); List<ResolveInfo> resolveInfoList = pm.queryIntentServices(implicitIntent, 0); if (resolveInfoList == null || resolveInfoList.size() != 1) return null; ResolveInfo serviceInfo = resolveInfoList.get(0); ComponentName componen = new ComponentName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name); Intent exlicitIntent = new Intent(implicitIntent); exlicitIntent.setComponent(componen); return exlicitIntent; } //Connecting: Intent intent = new Intent(IAsoftPOS.class.getName()); intent.setAction(AIDL_ACTION); intent.setPackage(AIDL_PACKAGE); bindService(convertImplicitIntentToExplicitIntent(intent), serviceConn, BIND_AUTO_CREATE); //Calling method messageExchange: byte[] response = common.messageExchange(tlvCommand); As total noob with this, I managed to convert to delphi function ConvertImplicitIntentToExplicitIntent(implicitIntent: JIntent): JIntent; var PM: JPackageManager; ResolveInfoList: JList; ServiceInfo: JResolveInfo; Componen: JComponentName; ExplicitIntent: JIntent; begin PM := TAndroidHelper.Context.getPackageManager; ResolveInfoList := PM.queryIntentServices(implicitIntent, 0); if (ResolveInfoList = nil) or (ResolveInfoList.size <> 1) then Exit(nil); ServiceInfo := TJavaObjectArray<JResolveInfo>.Wrap((ResolveInfoList as ILocalObject).GetObjectID).Items[0]; Componen := TJComponentName.JavaClass.init(ServiceInfo.ServiceInfo.packageName, ServiceInfo.ServiceInfo.name); ExplicitIntent := TJIntent.JavaClass.init(implicitIntent); ExplicitIntent.setComponent(Componen); Result := ExplicitIntent; end; And I'm stuck with ServiceConnection as I need to assign OnServiceConnected. var Common: JIAsoftPOS; ServiceConnection: JServiceConnection; procedure TfmPostTest.Button1Click(Sender: TObject); Var Intent: JIntent; Response: TJavaArray<Byte>; sendCommand: string; i: Integer; begin Intent := TJIntent.Create; Intent.setAction(StringToJString(AIDL_ACTION)); Intent.setPackage(StringToJString(AIDL_PACKAGE)); TAndroidHelper.Context.bindService(ConvertImplicitIntentToExplicitIntent(Intent), ServiceConnection, TJContext.JavaClass.BIND_AUTO_CREATE); Response := Common.messageExchange(StringToJA(IspisiracunTest)); if Response <> nil then for i := 0 to Response.length - 1 do sendCommand := sendCommand + IntToHex(Response[i]); showMessage(sendCommand); end; Si If anyone can look at it, greatly appreciated. I'm prepared to pay for the services as I'm on very tight schedule. Boris A920.zip
×