随着Delphi 10.4.2发布,ChinaCock作者也紧随其后,发布了支持10.4.2的版本:ChinaCock10.4.2百年建党童心向党版.从名字看作者是一个爱国主义者,让人敬佩!不仅如此,为了支持华为,作者在此版本中集成了华为扫描。接下来,我们通过组件包带的例子,看看如何在app中集成华为扫描。
首先,打开例子项目:...ChinaCockFMXdemosCCHuaweiScanner,打开后,会看到在主窗口上有一个CCHuaweiScanner1组件:
再看看这个组件的属性:
PlayVoice:扫码时是否播放声音
ScanSuccessdedFile:播放的声音文件,默认:scan_succeeded.mp3
ToastResult:是否显示扫描结果
Vibrate:是否震动
VibrateDuartion:震动周期,默认200
属性不多,想你也一看就明白。
接下来,我们看看执行描扫的代码:
procedure TForm1.CCButton1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([JStringToString(TJManifest_permission.JavaClass.CAMERA), JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)], procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>) begin if (Length(AGrantResults) = 3) then // 为什么为3?因为只申请了3个权限,返回肯定判断3个 begin // 三个全选都允许了,才能拍照 if (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then begin CCHuaweiScanner1.ToastResult := self.CCCheckBox1.IsChecked; CCHuaweiScanner1.Vibrate := self.CCCheckBox2.IsChecked; CCHuaweiScanner1.PlayVoice := self.CCCheckBox3.IsChecked; CCHuaweiScanner1.StartScan(//启动扫描方法,开始扫描,同时加入一个回调方法,接收描扫结果: procedure(AResult: String) begin Memo1.lines.Add(AResult); end ); end else begin end; end; end); end;
这里需要说明一下,该组件,还有一个事件:OnScanResultCallbackEvent,扫描结果回调事件,从名子就能看出,执行完扫描时触发,跟StartScan方法的支持的回调过程参数是一样的。
该组件的使用方法,就介绍完了,用起来简单的不能再简单。
接下来,看看比较麻烦的步骤,如何发布需要的文件:
首先,在项目管理器中加入控件使用的jar文件,如下图:
这些文件在X:ChinaCockFMXsdkHuaWeiScanner文件夹下,一共是13个文件:
然后,发布控件使用的资源文件及so文件:
要想操作简单,可以参考我以前写的文章,DeployMan,发布文件的利器,一次性发布整个文件夹中的文件。
最后,别忘修改AndroidManifest.template.xml,加入相应的权限与Activity:
<?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <!--相机权限--> <uses-permission android:name="android.permission.CAMERA" /> <!--读文件权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--使用特性--> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:resizeableActivity="false"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.huawei.hms.hmsscankit.ScanKitActivity" /> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->