• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphixe5调用外部扫描程序——谷歌zxing

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
[delphi] view plain copy
 
 print?
  1. unit uZXing;  
  2.   
  3. interface  
  4.  uses  
  5.   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,  
  6.   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,  
  7.   FMX.Layouts,  
  8.   System.Rtti,  
  9.   {$IF DEFINED(ANDROID)}  
  10.   FMX.Helpers.Android,  
  11.   Androidapi.JNI.Net,  
  12.   Androidapi.JNI.GraphicsContentViewText,  
  13.   Androidapi.JNI.JavaTypes,  
  14.   FMX.Platform.Android,  
  15.    {$ENDIF}  
  16.   FMX.platform;  
  17. const  
  18.   C_CodeModes: array[0..2] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');  
  19. type  
  20.    TCodeMode =(PRODUCT_MODE,QR_CODE_MODE,SCAN_MODE);  
  21.    TOnScanFinished =procedure(sData:string)of object;  
  22.    TZXingCall = class(TObject)  
  23.    private  
  24.     FClipboardService: IFMXClipboardService;  
  25.     FClipboardValue: TValue;  
  26.     FZXingCalled: Boolean;  
  27.     FZXingApkOpened: Boolean;  
  28.     FOnScanFinished:TOnScanFinished;  
  29.     FCanUse:Boolean;  
  30.     FOnInstallFinished:TNotifyEvent;  
  31.     procedure ClipboardSave;  
  32.     procedure ClipboardBack;  
  33.     {$IF DEFINED(ANDROID)}  
  34.     function GetZXingIntent: JIntent;  
  35.   
  36.     function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;  
  37.     function IsIntentCallable(const AIntent: JIntent): Boolean;  
  38.      {$ENDIF}  
  39.    public  
  40.     FAAppEvent: TApplicationEvent;  
  41.     constructor Create(Sender:TObject);  
  42.     destructor Destroy; override;  
  43.     procedure CallZXing( CodeMode:TCodeMode=SCAN_MODE);  
  44.     {$IF DEFINED(ANDROID)}  
  45.     function CheckEnvironment(var ErrorID:Integer):Boolean;  
  46.     {$ENDIF}  
  47.     procedure OpenURL(const AURL: string);  
  48.     procedure openFile(const sPath: string);  
  49.     property OnScanFinished:TOnScanFinished read FOnScanFinished write FOnScanFinished;  
  50.     property OnInstallFinished:TNotifyEvent read FOnInstallFinished write  FOnInstallFinished;  
  51.   end;  
  52. implementation  
  53.   
  54. { TZXingCall }  
  55.   
  56. procedure TZXingCall.CallZXing(CodeMode:TCodeMode);  
  57. {$IF DEFINED(ANDROID)}  
  58. var  
  59.   LIntent: JIntent;  
  60.  {$ENDIF}  
  61. begin  
  62.   FZXingApkOpened := false;  
  63.   if not FCanUse then Exit;  
  64.   
  65.   ClipboardSave;  
  66.   FClipboardService.SetClipboard('');  
  67.   {$IF DEFINED(ANDROID)}  
  68.   
  69.   LIntent := GetZXingIntent();  
  70.   LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(C_CodeModes[ord(CodeMode)]));  
  71.   SharedActivity.startActivityForResult(LIntent, 0);  
  72.   {$ENDIF}  
  73.   FZXingCalled := True;  
  74. end;  
  75.   
  76. {$IF DEFINED(ANDROID)}  
  77. function TZXingCall.CheckEnvironment(var ErrorID:Integer): Boolean;  
  78. var  
  79.   LFMXApplicationEventService: IFMXApplicationEventService;  
  80.   LIsZXingCallable: Boolean;  
  81.   LStr: string;  
  82. begin  
  83.   Result := False;  
  84.   if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService,  
  85.        IInterface(LFMXApplicationEventService)) then begin  
  86.     LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)  
  87.   end else begin  
  88.     ErrorID :=-1;  
  89.   end;  
  90.   if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,  
  91.        IInterface(FClipboardService)) then begin  
  92.     ErrorID :=-2;  
  93.   end;  
  94.   LIsZXingCallable := IsIntentCallable(GetZXingIntent);  
  95.   if not LIsZXingCallable then  
  96.   begin  
  97.     ErrorID :=-3;  
  98.   end ;  
  99.   result := Assigned(LFMXApplicationEventService) and  
  100.             Assigned(FClipboardService) and LIsZXingCallable;  
  101.   FCanUse := result;  
  102. end;  
  103. function TZXingCall.IsIntentCallable(const AIntent: JIntent): Boolean;  
  104. var  
  105.   LJPackageManager: JPackageManager;  
  106. begin  
  107.   Result := False;  
  108.   if Assigned(AIntent) then  
  109.   begin  
  110.     LJPackageManager := SharedActivityContext.getPackageManager;  
  111.     Result := LJPackageManager.queryIntentActivities(AIntent,  
  112.       TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0;  
  113.   end;  
  114. end;  
  115.   
  116. function TZXingCall.HandleAppEvent(AAppEvent: TApplicationEvent;  
  117.   AContext: TObject): Boolean;  
  118. var  
  119.   LResult: string;  
  120.   ErrorID:Integer;  
  121. begin  
  122.   if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then  
  123.   begin  
  124.     LResult := FClipboardService.GetClipboard.ToString;  
  125.     FClipboardService.SetClipboard('');  
  126.     if Assigned(FOnScanFinished) then begin  
  127.       FOnScanFinished(LResult);  
  128.     end;  
  129.     ClipboardBack;  
  130.     FZXingCalled := False;  
  131.   end;  
  132.   if FZXingApkOpened and (AAppEvent = TApplicationEvent.aeBecameActive)  then  
  133.   begin  
  134.     //--  
  135.   
  136.     if Assigned(FOnInstallFinished) then begin  
  137.       FAAppEvent := AAppEvent;  
  138.       FOnInstallFinished(self);  
  139.     end;  
  140.   
  141.     if self.CheckEnvironment(ErrorID) then begin  
  142.         FZXingApkOpened := False;  
  143.         self.CallZXing(QR_CODE_MODE);  
  144.     end;  
  145.   end;  
  146.   
  147.   Result := True;  
  148. end;  
  149. function TZXingCall.GetZXingIntent: JIntent;  
  150. const  
  151.   GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';  
  152.   GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';  
  153. begin  
  154.   Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));  
  155.   Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));  
  156. end;  
  157.   
  158. {$ENDIF}  
  159. procedure TZXingCall.ClipboardBack;  
  160. begin  
  161.   FClipboardService.SetClipboard(FClipboardValue);  
  162. end;  
  163.   
  164.   
  165. procedure TZXingCall.ClipboardSave;  
  166. begin  
  167.   FClipboardValue := FClipboardService.GetClipboard;  
  168. end;  
  169.   
  170.   
  171. constructor TZXingCall.Create(Sender: TObject);  
  172. begin  
  173.   //--  
  174.   FCanUse := False;  
  175.   FZXingApkOpened := False;  
  176. end;  
  177. procedure TZXingCall.OpenURL(const AURL: string);  
  178. {$IF DEFINED(ANDROID)}  
  179. var  
  180.   LIntent: JIntent;  
  181. {$ENDIF}  
  182. begin  
  183.   {$IF DEFINED(ANDROID)}  
  184.   LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,  
  185.     TJnet_Uri.JavaClass.parse(StringToJString(AURL)));  
  186.   SharedActivity.startActivity(LIntent);  
  187.   {$ENDIF}  
  188. end;  
  189. procedure TZXingCall.openFile(const sPath: string);  
  190. {$IF DEFINED(ANDROID)}  
  191. var  
  192.   LIntent: JIntent;  
  193.   barfile:JFile;  
  194. {$ENDIF}  
  195. begin  
  196.   {$IF DEFINED(ANDROID)}  
  197.   LIntent := TJIntent.JavaClass.init();  
  198.   LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);  
  199.   LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);  
  200.   barfile := TJFile.JavaClass.init(StringToJString(sPath));  
  201.   barfile.setReadable(True,False);  //--这几句很重要,不然调不出来安装包  
  202.   barfile.setWritable(True,False);  
  203.   LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(barfile),  
  204.                           StringToJString('application/vnd.android.package-archive'));  
  205.   
  206.   //--SharedActivity.startActivity(LIntent);  
  207.   SharedActivity.startActivityForResult(LIntent, 0);  
  208.   FZXingApkOpened := True;  
  209.   {$ENDIF}  
  210. end;  
  211.   
  212. destructor TZXingCall.Destroy;  
  213. begin  
  214.   
  215.   inherited;  
  216. end;  
  217.   
  218.   
  219. end.  
 
 
http://blog.csdn.net/syndicater/article/details/18708323

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphiIOSBLE代理发布时间:2022-07-18
下一篇:
delphi调用udl文件读写数据库连接信息发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap