前篇文章介紹了在delphi App(以下簡稱App)中可使用intent來調用Google ZXing 條碼掃描器(以下簡稱zx),其各有優缺點,優點是我們不需關注zx本身的細節,只需調用其接口即可,缺點是需額外安裝zx掃描程序,如此一來客戶體驗就不夠好,那么可否將zx直接整合到App中呢,答案是可以, 但實際操作起來會稍顯繁瑣,我們具體來看下過程,其中分兩部分:第一部分介紹如何配置編譯zx源碼,第二部分介紹如何與App整合。
第一部分:zx源碼的配置和編譯
1:下載源碼
我選用的是2.3.0版本, 下載解壓后如下圖:

我們只需用到三個文件夾,其中
core: 核心庫文件。
Android-integration:自帶的整合庫,編譯時要用到。
android:自帶示例掃描程序(zx)。
2.將核心庫打包為jar
這里我是先將core和android-integratio分別打包成jar來使用,你也可以直接使用源碼。打開eclipse, 新建Android Application Project,名字可任取,不需創建Activity,完成后在項目下新建src文件夾,將core中com文件夾整體復制到src中,右鍵項目,選擇Export,在窗口中選擇Java里的JAR file:

只選取src文件夾, 這里導出名為ZXCore2.3.jar,android-integratio做同樣的操作后得到ZXIntegration2.3.jar留着待用。
3.編譯zx
復制一份Android文件夾(名字可自取),打開eclipse, 創建 Android from existing code, 選取上述文件夾,完成之后項目中就有CaptureActivity(zx),然后導入上面打包好的兩個jar文件,如下圖所示:

Build一下,如果沒有出錯提示,說明環境已經配置成功。
4.源碼稍作修改,以便delphi能正常回調
a.打開CaptureActivity.java,注釋掉onCreateOptionsMenu 事件,將菜單暫時隱藏掉,讓它看起來更像個模塊(你也可保留,但相關功能的資源文件必須發布且需在AndroidManifest添加相應Activity(如涉及到))。
b.定位到 onResume事件: 注釋以下兩塊代碼:


現在將工程重新Build或運行一次后就等待和App整合了。
第二部分 App整合zx
1.整合資源
新建Firemonkey Mobile App, 在根目錄建立如下文件夾:

將 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中對照下面添加權限:

5. 修改AndroidManifest.template.xml
a:將默認名稱改成[package].[NativeActivitySubclass](視你的名稱而定);
b.添加CaptureActivity(這里只添加掃描功能,其他可按需添加)。

6.發布
a. Project > deployment:
將目錄里Capture_res打包到相應目錄(不必將所有文件都打包進去,我刪除了一些多語言和幫助文件(如果你的本地語言不是簡體 中文,可以自己添加);
b.將delphi自帶的classes.dex替換成整合后的classes.dex。

7. Build App, 調用zx
既然zx已被整合,那么調用就非常簡單了,只需三行代碼即可(詳細調用可見Demo):
- procedure CallInternalZXing;
- var
- LIntent: JIntent;
- begin
- LIntent := TJIntent.JavaClass.init;
- LIntent.setClassName(SharedActivityContext, StringToJString('com.google.zxing.client.android.CaptureActivity'));
- SharedActivity.startActivityForResult(LIntent, 0);
- end;
App運行效果圖(注意原先的"條碼掃描器"已變成我們的App名稱了):

返回編碼格式和解析結果:

完整例子(包含ZXing2.3源碼, 修改版CaptureActivity和詳細Demo):
http://download.csdn.net/detail/flcop/6993665
http://blog.csdn.net/flcop/article/details/20240703
