zoukankan      html  css  js  c++  java
  • Delphi xe5调用外部扫描程序——谷歌 zxing

    [delphi] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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
  • 相关阅读:
    iOS:分组的表格视图UITableView,可以折叠和展开
    iOS:带主标题、副标题、图像类型的表格视图UITableView
    iOS:多个单元格的删除(方法二):
    iOS:多个单元格的删除(方法一)
    iOS:UITableViewCell自定义单元格
    iOS:删除、插入、移动单元格
    iOS:UITableView表格视图控件
    iOS:UIImageView图像视图控件
    iOS:UIScrollView控件和UIPageControl控件的详解
    淘宝卖家工具推荐
  • 原文地址:https://www.cnblogs.com/findumars/p/6358492.html
Copyright © 2011-2022 走看看