2016-09-16 8 views
0

C++ Builder 10.1 Berlinを使用して、Androidデバイス上のバーコードをスキャンするアプリを開発中です。バーコードを取得するには、私はIntentによってZXingアプリを呼び出します。 GSI-128バーコードをスキャンすると、戻り値のタイプはCODE-128です。私のアプリでは、バーコードのタイプ(128とGSI-128)によって処理が異なります。Zxing:128個のバーコードとGSI-128を区別する

これらのバーコードの種類を区別する方法はありますか?

答えて

0

:ここ

はブライアン・ロングのブログからDelphiでスキャンをZXingの例です。 。バーコードが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); 
0

参照ZXingのマニュアル:

Scanning Via Intent

ZXingは、スキャンを開始し、その結果を解析するIntentIntegratorクラスを提供します。バーコードタイプはScanResults.formatNameフィールドにあります。

IntentIntegratorを使用しない場合は、結果を手動で解析する必要があります。Intentバーコードタイプは、インテントのSCAN_RESULT_FORMAT余分な文字列フィールドで利用できます。

どちらの方法でも、FireMonkeyのmessaging frameworkを使用して結果Intentを受け取ることができます。それはTMessageResultNotificationメッセージの中にラップされます。ただintent->putExtra(StringToJString("ASSUME_GS1"), true);と引数を追加し、startActivityForResult(intent,0);でテントを呼び出す前に

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; 
+0

おかげレミ私は既にこれをしなかったが、両方の128とGSI-128バーコードのために、 'SCAN_RESULT_FORMAT'の値が同じ(' CODE-128単位)です。 – Dylan

関連する問題