Zxing:区分128条码和GSI-128
Zxing: Differentiate 128 barcodes and GSI-128
我正在使用 C++ Builder 10.1 Berlin 开发一个应用程序来扫描 Android 设备上的条形码。为了获得条形码,我通过 Intent 调用了 ZXing 应用程序。当我扫描 GSI-128 条码时,return 类型是 CODE-128。在我的应用程序中,处理因条形码类型(128 和 GSI-128)而异。
有什么方法可以区分这几种条形码吗?
查看 ZXing 的文档:
ZXing 提供了一个IntentIntegrator
class 来启动扫描和解析结果。条形码类型在 ScanResults.formatName
字段中。
如果您不想使用 IntentIntegrator
,则必须手动解析结果 Intent
。条形码类型在 Intent 的 SCAN_RESULT_FORMAT
额外字符串字段中可用。
无论哪种方式,您都可以使用 FireMonkey 的 messaging framework 来接收结果 Intent
。它将被包装在 TMessageResultNotification
消息中。
这里是来自 Brian Long 的博客 Delphi 中的 ZXing 扫描示例:
Launching activities and handling results in Delphi XE6 Android apps: Scanning a bar code
function LaunchActivityForResult(const Intent: JIntent; RequestCode: Integer): Boolean;
var
ResolveInfo: JResolveInfo;
begin
ResolveInfo := SharedActivity.getPackageManager.resolveActivity(Intent, 0);
Result := ResolveInfo <> nil;
if Result then
SharedActivity.startActivityForResult(Intent, RequestCode);
end;
//For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
procedure LaunchQRScanner(RequestCode: Integer);
var
Intent: JIntent;
begin
Intent := TJIntent.JavaClass.init(StringToJString('com.google.zxing.client.android.SCAN'));
Intent.setPackage(StringToJString('com.google.zxing.client.android'));
// If you want to target QR codes
//Intent.putExtra(StringToJString('SCAN_MODE'), StringToJString('QR_CODE_MODE'));
if not LaunchActivityForResult(Intent, RequestCode) then
Toast('Cannot display QR scanner', ShortToast);
end;
uses
System.Messaging,
...
type
TMainForm = class(TForm)
...
private
const ScanRequestCode = 0;
var FMessageSubscriptionID: Integer;
procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
...
end;
...
uses
FMX.Platform.Android,
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.Toast,
LaunchActivities,
...
procedure TMainForm.BarcodeScannerButtonClick(Sender: TObject);
begin
FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,
HandleActivityMessage);
LaunchQRScanner(ScanRequestCode);
end;
procedure TMainForm.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
if M is TMessageResultNotification then
OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode,
TMessageResultNotification(M).Value);
end;
function TMainForm.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
var
ScanContent, ScanFormat: string;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
FMessageSubscriptionID := 0;
// For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
if RequestCode = ScanRequestCode then
begin
if ResultCode = TJActivity.JavaClass.RESULT_OK then
begin
if Assigned(Data) then
begin
ScanContent := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT')));
ScanFormat := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT_FORMAT')));
Toast(Format('Found %s format barcode:'#10'%s', [ScanFormat, ScanContent]), LongToast);
end;
end
else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
begin
Toast('You cancelled the scan', ShortToast);
end;
Result := True;
end;
end;
在使用 startActivityForResult(intent,0);
调用 Intent 之前,只需添加一个参数 intent->putExtra(StringToJString("ASSUME_GS1"), true);
。如果条形码是 GS1-128,则会在您的条形码处添加前缀“]C1”。
_di_JIntent intent;
msgID = TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageResultNotification), &retourScanTel);
intent = TJIntent::Create();
intent->setAction(StringToJString("com.google.zxing.client.android.SCAN"));
intent->putExtra(StringToJString("ASSUME_GS1"), true);
SharedActivity()->startActivityForResult(intent,0);
我正在使用 C++ Builder 10.1 Berlin 开发一个应用程序来扫描 Android 设备上的条形码。为了获得条形码,我通过 Intent 调用了 ZXing 应用程序。当我扫描 GSI-128 条码时,return 类型是 CODE-128。在我的应用程序中,处理因条形码类型(128 和 GSI-128)而异。
有什么方法可以区分这几种条形码吗?
查看 ZXing 的文档:
ZXing 提供了一个IntentIntegrator
class 来启动扫描和解析结果。条形码类型在 ScanResults.formatName
字段中。
如果您不想使用 IntentIntegrator
,则必须手动解析结果 Intent
。条形码类型在 Intent 的 SCAN_RESULT_FORMAT
额外字符串字段中可用。
无论哪种方式,您都可以使用 FireMonkey 的 messaging framework 来接收结果 Intent
。它将被包装在 TMessageResultNotification
消息中。
这里是来自 Brian Long 的博客 Delphi 中的 ZXing 扫描示例:
Launching activities and handling results in Delphi XE6 Android apps: Scanning a bar code
function LaunchActivityForResult(const Intent: JIntent; RequestCode: Integer): Boolean;
var
ResolveInfo: JResolveInfo;
begin
ResolveInfo := SharedActivity.getPackageManager.resolveActivity(Intent, 0);
Result := ResolveInfo <> nil;
if Result then
SharedActivity.startActivityForResult(Intent, RequestCode);
end;
//For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
procedure LaunchQRScanner(RequestCode: Integer);
var
Intent: JIntent;
begin
Intent := TJIntent.JavaClass.init(StringToJString('com.google.zxing.client.android.SCAN'));
Intent.setPackage(StringToJString('com.google.zxing.client.android'));
// If you want to target QR codes
//Intent.putExtra(StringToJString('SCAN_MODE'), StringToJString('QR_CODE_MODE'));
if not LaunchActivityForResult(Intent, RequestCode) then
Toast('Cannot display QR scanner', ShortToast);
end;
uses
System.Messaging,
...
type
TMainForm = class(TForm)
...
private
const ScanRequestCode = 0;
var FMessageSubscriptionID: Integer;
procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
...
end;
...
uses
FMX.Platform.Android,
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.Toast,
LaunchActivities,
...
procedure TMainForm.BarcodeScannerButtonClick(Sender: TObject);
begin
FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,
HandleActivityMessage);
LaunchQRScanner(ScanRequestCode);
end;
procedure TMainForm.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
if M is TMessageResultNotification then
OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode,
TMessageResultNotification(M).Value);
end;
function TMainForm.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
var
ScanContent, ScanFormat: string;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
FMessageSubscriptionID := 0;
// For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
if RequestCode = ScanRequestCode then
begin
if ResultCode = TJActivity.JavaClass.RESULT_OK then
begin
if Assigned(Data) then
begin
ScanContent := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT')));
ScanFormat := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT_FORMAT')));
Toast(Format('Found %s format barcode:'#10'%s', [ScanFormat, ScanContent]), LongToast);
end;
end
else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
begin
Toast('You cancelled the scan', ShortToast);
end;
Result := True;
end;
end;
在使用 startActivityForResult(intent,0);
调用 Intent 之前,只需添加一个参数 intent->putExtra(StringToJString("ASSUME_GS1"), true);
。如果条形码是 GS1-128,则会在您的条形码处添加前缀“]C1”。
_di_JIntent intent;
msgID = TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageResultNotification), &retourScanTel);
intent = TJIntent::Create();
intent->setAction(StringToJString("com.google.zxing.client.android.SCAN"));
intent->putExtra(StringToJString("ASSUME_GS1"), true);
SharedActivity()->startActivityForResult(intent,0);