- unit uZXing;  
-   
- interface  
-  uses  
-   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,  
-   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,  
-   FMX.Layouts,  
-   System.Rtti,  
-   {$IF DEFINED(ANDROID)}  
-   FMX.Helpers.Android,  
-   Androidapi.JNI.Net,  
-   Androidapi.JNI.GraphicsContentViewText,  
-   Androidapi.JNI.JavaTypes,  
-   FMX.Platform.Android,  
-    {$ENDIF}  
-   FMX.platform;  
- const  
-   C_CodeModes: array[0..2] of string = (‘PRODUCT_MODE‘, ‘QR_CODE_MODE‘, ‘SCAN_MODE‘);  
- type  
-    TCodeMode =(PRODUCT_MODE,QR_CODE_MODE,SCAN_MODE);  
-    TOnScanFinished =procedure(sData:string)of object;  
-    TZXingCall = class(TObject)  
-    private  
-     FClipboardService: IFMXClipboardService;  
-     FClipboardValue: TValue;  
-     FZXingCalled: Boolean;  
-     FZXingApkOpened: Boolean;  
-     FOnScanFinished:TOnScanFinished;  
-     FCanUse:Boolean;  
-     FOnInstallFinished:TNotifyEvent;  
-     procedure ClipboardSave;  
-     procedure ClipboardBack;  
-     {$IF DEFINED(ANDROID)}  
-     function GetZXingIntent: JIntent;  
-   
-     function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;  
-     function IsIntentCallable(const AIntent: JIntent): Boolean;  
-      {$ENDIF}  
-    public  
-     FAAppEvent: TApplicationEvent;  
-     constructor Create(Sender:TObject);  
-     destructor Destroy; override;  
-     procedure CallZXing( CodeMode:TCodeMode=SCAN_MODE);  
-     {$IF DEFINED(ANDROID)}  
-     function CheckEnvironment(var ErrorID:Integer):Boolean;  
-     {$ENDIF}  
-     procedure OpenURL(const AURL: string);  
-     procedure openFile(const sPath: string);  
-     property OnScanFinished:TOnScanFinished read FOnScanFinished write FOnScanFinished;  
-     property OnInstallFinished:TNotifyEvent read FOnInstallFinished write  FOnInstallFinished;  
-   end;  
- implementation  
-   
-   
- procedure TZXingCall.CallZXing(CodeMode:TCodeMode);  
- {$IF DEFINED(ANDROID)}  
- var  
-   LIntent: JIntent;  
-  {$ENDIF}  
- begin  
-   FZXingApkOpened := false;  
-   if not FCanUse then Exit;  
-   
-   ClipboardSave;  
-   FClipboardService.SetClipboard(‘‘);  
-   {$IF DEFINED(ANDROID)}  
-   
-   LIntent := GetZXingIntent();  
-   LIntent.putExtra(StringToJString(‘SCAN_MODE‘), StringToJString(C_CodeModes[ord(CodeMode)]));  
-   SharedActivity.startActivityForResult(LIntent, 0);  
-   {$ENDIF}  
-   FZXingCalled := True;  
- end;  
-   
- {$IF DEFINED(ANDROID)}  
- function TZXingCall.CheckEnvironment(var ErrorID:Integer): Boolean;  
- var  
-   LFMXApplicationEventService: IFMXApplicationEventService;  
-   LIsZXingCallable: Boolean;  
-   LStr: string;  
- begin  
-   Result := False;  
-   if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService,  
-        IInterface(LFMXApplicationEventService)) then begin  
-     LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)  
-   end else begin  
-     ErrorID :=-1;  
-   end;  
-   if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,  
-        IInterface(FClipboardService)) then begin  
-     ErrorID :=-2;  
-   end;  
-   LIsZXingCallable := IsIntentCallable(GetZXingIntent);  
-   if not LIsZXingCallable then  
-   begin  
-     ErrorID :=-3;  
-   end ;  
-   result := Assigned(LFMXApplicationEventService) and  
-             Assigned(FClipboardService) and LIsZXingCallable;  
-   FCanUse := result;  
- end;  
- function TZXingCall.IsIntentCallable(const AIntent: JIntent): Boolean;  
- var  
-   LJPackageManager: JPackageManager;  
- begin  
-   Result := False;  
-   if Assigned(AIntent) then  
-   begin  
-     LJPackageManager := SharedActivityContext.getPackageManager;  
-     Result := LJPackageManager.queryIntentActivities(AIntent,  
-       TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0;  
-   end;  
- end;  
-   
- function TZXingCall.HandleAppEvent(AAppEvent: TApplicationEvent;  
-   AContext: TObject): Boolean;  
- var  
-   LResult: string;  
-   ErrorID:Integer;  
- begin  
-   if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then  
-   begin  
-     LResult := FClipboardService.GetClipboard.ToString;  
-     FClipboardService.SetClipboard(‘‘);  
-     if Assigned(FOnScanFinished) then begin  
-       FOnScanFinished(LResult);  
-     end;  
-     ClipboardBack;  
-     FZXingCalled := False;  
-   end;  
-   if FZXingApkOpened and (AAppEvent = TApplicationEvent.aeBecameActive)  then  
-   begin  
-     
-   
-     if Assigned(FOnInstallFinished) then begin  
-       FAAppEvent := AAppEvent;  
-       FOnInstallFinished(self);  
-     end;  
-   
-     if self.CheckEnvironment(ErrorID) then begin  
-         FZXingApkOpened := False;  
-         self.CallZXing(QR_CODE_MODE);  
-     end;  
-   end;  
-   
-   Result := True;  
- end;  
- function TZXingCall.GetZXingIntent: JIntent;  
- const  
-   GOOGLE_ZXING = ‘com.google.zxing.client.android.SCAN‘;  
-   GOOGLE_ZXING_PACKAGE = ‘com.google.zxing.client.android‘;  
- begin  
-   Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));  
-   Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));  
- end;  
-   
- {$ENDIF}  
- procedure TZXingCall.ClipboardBack;  
- begin  
-   FClipboardService.SetClipboard(FClipboardValue);  
- end;  
-   
-   
- procedure TZXingCall.ClipboardSave;  
- begin  
-   FClipboardValue := FClipboardService.GetClipboard;  
- end;  
-   
-   
- constructor TZXingCall.Create(Sender: TObject);  
- begin  
-   
-   FCanUse := False;  
-   FZXingApkOpened := False;  
- end;  
- procedure TZXingCall.OpenURL(const AURL: string);  
- {$IF DEFINED(ANDROID)}  
- var  
-   LIntent: JIntent;  
- {$ENDIF}  
- begin  
-   {$IF DEFINED(ANDROID)}  
-   LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,  
-     TJnet_Uri.JavaClass.parse(StringToJString(AURL)));  
-   SharedActivity.startActivity(LIntent);  
-   {$ENDIF}  
- end;  
- procedure TZXingCall.openFile(const sPath: string);  
- {$IF DEFINED(ANDROID)}  
- var  
-   LIntent: JIntent;  
-   barfile:JFile;  
- {$ENDIF}  
- begin  
-   {$IF DEFINED(ANDROID)}  
-   LIntent := TJIntent.JavaClass.init();  
-   LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);  
-   LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);  
-   barfile := TJFile.JavaClass.init(StringToJString(sPath));  
-   barfile.setReadable(True,False);  
-   barfile.setWritable(True,False);  
-   LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(barfile),  
-                           StringToJString(‘application/vnd.android.package-archive‘));  
-   
-   
-   SharedActivity.startActivityForResult(LIntent, 0);  
-   FZXingApkOpened := True;  
-   {$ENDIF}  
- end;  
-   
- destructor TZXingCall.Destroy;  
- begin  
-   
-   inherited;  
- end;  
-   
-   
- end.  
 
 
 
 
http://blog.csdn.net/syndicater/article/details/18708323
Delphi xe5调用外部扫描程序——谷歌 zxing
原文:http://www.cnblogs.com/findumars/p/6358492.html