Delphi Android 将Google ZXing 整合(调用Jar文件)

知识就是力量,时间就是生命。这篇文章主要讲述Delphi Android 将Google ZXing 整合(调用Jar文件)相关的知识,希望能为你提供帮助。
      前篇文章介绍了在delphi App(以下简称App)中可使用intent来调用Google ZXing 条码扫描器(以下简称zx),其各有优缺点,优点是我们不需关注zx本身的细节,只需调用其接口即可,缺点是需额外安装zx扫描程序,如此一来客户体验就不够好,那么可否将zx直接整合到App中呢,答案是可以, 但实际操作起来会稍显繁琐,我们具体来看下过程,其中分两部分:第一部分介绍如何配置编译zx源码,第二部分介绍如何与App整合。
 
第一部分:zx源码的配置和编译 1:下载源码  我选用的是2.3.0版本, 下载解压后如下图: 

Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

我们只需用到三个文件夹,其中
  core: 核心库文件。
    Android-integration:自带的整合库,编译时要用到。
    android:自带示例扫描程序(zx)。
2.将核心库打包为jar  这里我是先将core和android-integratio分别打包成jar来使用,你也可以直接使用源码。打开eclipse, 新建Android Application   Project,名字可任取,不需创建Activity,完成后在项目下新建src文件夹,将core中com文件夹整体复制到src中,右键项目,选择Export,在窗口中选择Java里的JAR file:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

 
只选取src文件夹, 这里导出名为ZXCore2.3.jar,android-integratio做同样的操作后得到ZXIntegration2.3.jar留着待用。
3.编译zx复制一份Android文件夹(名字可自取),打开eclipse, 创建 Android   from existing code, 选取上述文件夹,完成之后项目中就有CaptureActivity(zx),然后导入上面打包好的两个jar文件,如下图所示:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

Build一下,如果没有出错提示,说明环境已经配置成功。
4.源码稍作修改,以便delphi能正常回调  a.打开CaptureActivity.java,注释掉onCreateOptionsMenu 事件,将菜单暂时隐藏掉,让它看起来更像个模块(你也可保留,但相关功能的资源文件必须发布且需在AndroidManifest添加相应Activity(如涉及到))。
  b.定位到 onResume事件: 注释以下两块代码:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

现在将工程重新Build或运行一次后就等待和App整合了。
 
第二部分 App整合zx 
1.整合资源  新建Firemonkey Mobile App, 在根目录建立如下文件夹:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

将 CaptureActivity中res里的文件复制到capture_assets中(本例中capture_assets文件夹存放的是一些帮助文件,未使用到,可以删除)。


2.创建本地回调函数  创建NativeActivitySubclass.java, 用于回调 zx 完成扫描后的 onActivityResult事件,该类继承自delphi NativeActivity,并在里面注册了一个Native回调方法,将 NativeActivitySubclass.java 生成 NativeActivitySubclass.dex的详细过程就不赘述了,这里说一下大致流程, 先将delphi 自带的classes.dex 还原成embarcadero.jar,使用 javac 带上 embarcadero.jar和 android.jar环境编译NativeActivitySubclass.java得到NativeActivitySubclass.class, 使用jar cvf 命令 将NativeActivitySubclass.class打包成jar,最后使用dx生成NativeActivitySubclass.dex。


3.合并dex  这里需要合并3个文件, Delphi自带的classes.dex, NativeActivitySubclass.dex,还有一个在CaptureActivity项目里的bin\classes.dex,使用DexMerger合并上面3个dex为一个classes.dex, 至此功能已经整合完毕。


4.添加权限  delphi IDE > project > options > uses permission中对照下面添加权限:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

5. 修改AndroidManifest.template.xml 
  a:将默认名称改成[package].[NativeActivitySubclass](视你的名称而定);
  b.添加CaptureActivity(这里只添加扫描功能,其他可按需添加)。
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

6.发布  a. Project > deployment:
      将目录里Capture_res打包到相应目录(不必将所有文件都打包进去,我删除了一些多语言和帮助文件(如果你的本地语言不是简体  中文,可以自己添加);
  b.将delphi自带的classes.dex替换成整合后的classes.dex。
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

 
7. Build App, 调用zx  既然zx已被整合,那么调用就非常简单了,只需三行代码即可(详细调用可见Demo):
 
 
[delphi]  view plain  copy  
  1. procedure  CallInternalZXing;    
  2. var   
  3.     LIntent:  JIntent;    
  4. begin   
  5.     LIntent  :=  TJIntent.JavaClass.init;    
  6.     LIntent.setClassName(SharedActivityContext,  StringToJString(‘com.google.zxing.client.android.CaptureActivity‘));    
  7.     SharedActivity.startActivityForResult(LIntent,  0);    
  8. end;    
 
 
App运行效果图(注意原先的"条码扫描器"已变成我们的App名称了):
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

 
返回编码格式和解析结果:
Delphi Android 将Google ZXing 整合(调用Jar文件)

文章图片

 
【Delphi Android 将Google ZXing 整合(调用Jar文件)】完整例子(包含ZXing2.3源码, 修改版CaptureActivity和详细Demo):
http://download.csdn.net/detail/flcop/6993665
 
http://blog.csdn.net/flcop/article/details/20240703

    推荐阅读