嗨社区我对我的 Delphi Android 应用程序有疑问。任务是使用 Delphi 创建一个可以在 POS 打印机上打印字符串的 Android 应用程序(我使用 Bixolon SPP-R200II 打印机)。
例如,用户启动应用程序并在文本字段“Hello Printer”中输入,而不是我希望打印机仅打印此字符串。
我的问题是,如果我单击打印,打印机会将“Hello PrinterHello PrinterHello PrinterHello PrinterHello PrinterHello Printer”打印到行尾:(
对于我的应用程序,我创建了一个具有 4 个函数的类。
GetDeviceList() : TStringList; // 有了这个,我得到一个带有蓝牙设备的 TStringList,我绑定到我的 ListView
CreateConnectionToBluetoothDevice(设备:TListViewItem):字符串; //这将创建与蓝牙设备的连接
PrintText(文本:字符串):字符串; //这是带有字符串参数的打印函数
StringToJA(数据:字符串;字符集:字符串 = ''):TJavaArray; //这是一个帮助函数,用这个函数我可以将一个字符串转换为一个TJavaArray
这是我的 AndroidBluetooth 类:
unit AndroidBluetooth;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.ListView,System.math, FMX.Forms,
Androidapi.JNI.BluetoothAdapter,
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge,
Android.JNI.Toast;
type TAndroidBluetooth = class
private
public
devicename : string;
uid:JUUID;
targetMAC:string;
Adapter:JBluetoothAdapter;
remoteDevice:JBluetoothDevice;
Sock:JBluetoothSocket;
ostream:JOutputStream;
//istream:JInputstream;
constructor create();
function StringToJA(Data: String; charset: String = '') : TJavaArray<Byte>;
function GetDeviceList() : TStringList;
function CreateConnectionToBluetoothDevice(device : TListViewItem) : string;
function PrintText(text : string) : string;
end;
implementation
// ## Klassenexterne Funktionen ##
{Konstruktor}
constructor TAndroidBluetooth.create;
begin
inherited Create;
end;
{Funktion: Gibt alle Bluetooth Geräte in der nähe zurück}
function TAndroidBluetooth.GetDeviceList : TStringList;
var
s:string;
list:TStringList;
begin
list:=TStringList.Create;
s:=checkBluetooth; // Make sure bluetooth is enabled
Toast(s);
if pos('disabled',s)<>0 then exit;
uid := TJUUID.JavaClass.fromString(stringtojstring('00001101-0000-1000-8000-00805F9B34FB'));
list.Clear;
list.AddStrings(getbonded);
result := list;
end;
{Funktion: Stellt eine Verbindung zu einem Bluetooth Gerät her}
function TAndroidBluetooth.CreateConnectionToBluetoothDevice(device : TListViewItem) : string;
var
len,idx,i:integer;
s:string;
buffer:TJavaArray<byte>;
begin
Toast('Selected '+device.Text);
targetMAC:=device.Detail;
if trim(targetMAC)='' then exit;
Adapter:=TJBluetoothAdapter.JavaClass.getDefaultAdapter;
remoteDevice:=Adapter.getRemoteDevice(stringtojstring(targetMAC));
Toast('Connecting to '+device.Text+' ('+device.Detail+')');
devicename := device.Text;
sock:=remoteDevice.createRfcommSocketToServiceRecord(uid);
try sock.connect;
except Toast('Could not create service record!');
end;
if not sock.isConnected then
begin
Toast('Failed to connect to '+targetMAC+'! Try again...');
exit;
end;
Toast('Connected!');
ostream:=sock.getOutputStream;
//istream:=sock.getInputStream;
Application.ProcessMessages;
ostream.write(ord(255)); //
ostream.write(ord(255)); // get device id (nur Chitanda)
sleep(200);
end;
{Funktion: Druckt einen String auf einem Bluetooth Gerät}
function TAndroidBluetooth.PrintText(text : string) : string;
var
txt: string;
data: TJavaArray<Byte>;
sendText : TJavaArray<Byte>;
begin
txt := text;
data := StringToJA(txt,'iso8859-2');
sendText := TJavaArray<Byte>.Create(3);
sendText.Items[0] := $1B;
sendText.Items[1] := $74;
sendText.Items[2] := Byte(23);
ostream.write(sendText);
ostream.write(data);
end;
{Funktion: Konvertiert ein String in ein TJavaArray<Byte>}
function TAndroidBluetooth.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;
end.
我希望我能得到帮助:)