Delphi xe5调用外部扫描程序——谷歌 zxing
- 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
- { TZXingCall }
- 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.startActivity(LIntent);
- SharedActivity.startActivityForResult(LIntent, 0);
- FZXingApkOpened := True;
- {$ENDIF}
- end;
- destructor TZXingCall.Destroy;
- begin
- inherited;
- end;
- end.
Delphi xe5调用外部扫描程序——谷歌 zxing的更多相关文章
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...
- c# 调用外部exe程序
c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; ...
- C++调用外部应用程序
很多时候,我们的程序需要调用DOS命令,通过Dos命令调用其他程序从而完成所需要完成的功能.比如,调用Dos程序PKZIP完成ZIP包的解压缩,调用SVN完成文件的更新或者上传.但是在程序运行时又要求 ...
- Delphi XE5教程5:程序的结构和语法
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- Delphi XE5教程4:程序和单元概述
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- Delphi XE5教程2:程序组织
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- [转]VC中调用外部exe程序方式
本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...
- 减小Delphi XE5编译出来的程序体积
默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大. 一般用两个方法可以很大程度上减少程序体积. 一.在工程中用编译指令禁用RTTI 禁用的方法很简单 ...
- C++调用外部应用程序的方法的整理总结(常用)
一.三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些 ...
随机推荐
- React事件处理函数传参问题
React事件处理函数参数 HTML标签与React 组件是不同的,事件对象e是HTML标签元素的,组件没有的.
- 再议指针---------函数回调(qsort函数原理)
我们是否能写一个这种函数: 能够对不论什么类型数据排序 不论什么人在使用该函数不须要改动该函数代码(即:用户能够不必看到函数源 码,仅仅会调用即可) 思考: 用户须要排序的数据的类型千变万化,可能是i ...
- Xcode7.1 网络请求报错
The resource could not be loaded because the App Transport Security policy reguir 原因:iOS9引入了新特性App T ...
- Arcgis api for javascript学习笔记(3.2X版本)-Map图层叠加以及基本操作
1. 不设置默认底图,第一个图层作为底图,然后叠加另外一个图层 先添加图层1,第一个图层1作为默认底图,然后在图层1上叠加图层2,并设置图层2的透明度为50%. <!DOCTYPE html&g ...
- WPF 使用 SharpDX
原文:WPF 使用 SharpDX 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问 ...
- 允许Android对于飞行模拟器
Android模拟器是公认的慢,并且不是一般的慢,即使在高性能的PC上,跟开发环境没关系,由于它就是慢.可是我们又必须使用模拟器,比方在測试Android不同版本号的兼容性时,或者在測试不同屏幕尺寸的 ...
- 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP
原文 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP 能上架 Windows 应用商店的并不一定必须是 UWP 应 ...
- 3D场景中的鼠标响应事件
原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...
- OpenGL(十二) 纹理映射(贴图)
OpenGL绘制纹理的步骤: 1. 开启纹理功能 使用glEnable(GL_TEXTURE_2D)开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)关闭纹理,默认情况下纹理是关闭 ...
- pip 9.0 离线安装Python3的环境库
到客户现场实施,很多情况下是没有网络的,我们需要在办公室准备好离线安装包. 假设现有已联网的客户机A,一台无网络的客户机B 客户机A 1.生成本地环境的包清单 pip3 freeze > req ...