天天看點

Android執行個體-實作掃描二維碼并生成二維碼(XE8+小米5)

相關資料:

第三方資料太大沒法寫在博文上,請下載下傳CSDN的程式包。

注意事項:

如果隻加了Lib,然沒有改AndroidManifest.xml,App在呼叫BarCode時會ANR沒反應。

開始可能沒有官方的classes.dex,但如果發現編譯出錯後,請再檢查一下。

TMessageManager須加System.Messaging單元。

使用DelphiXE7加入JavaLibrary後,呼叫Zxing相機

1.建立一個DelphiXE工程,輕按兩下"Android-Android ADK 25.1.7.32bit"。

2.依照Zxing會用到的Android權限,在 project->options->uses permission 加上權限。

Access wifi state//通路WIFI狀态

Camera//相機

Change wifi state//更改WIFI狀态

Flashlight//手電筒

Internet//網際網路

Read contacts//讀聯系人

Read history bookmarks//讀曆史書簽

Vibrate//顫動

Write extrnal storage//寫外置儲存

3.把解好的Jar檔案放到項目目錄下

如:"CreateActivity.jar"放到"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\"目錄下。

4.引入Jar包。

在"Project1"->"Android-Android SDK 25.1.7.32bit"->Libraries->右擊->"Add"->選中"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\CreateActivity.jar"->打開。

5.在"Project1"->"Compile"編譯一次,産生 AndroidManifest.template.xml ,但不要Run手機的App。

6.修改AndroidManifest.template.xml,加入CaptureActivity的區段。

位置在"<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"下面。

代碼如下:

<activity android:name="com.google.zxing.client.android.CaptureActivity"

          android:screenOrientation="portrait"

          android:clearTaskOnLaunch="true"

          android:stateNotNeeded="true"

          android:configChanges="orientation|keyboardHidden"

          android:theme="@style/CaptureTheme"

          android:windowSoftInputMode="stateAlwaysHidden">

</activity>

7.這個時候編譯會出現下面錯誤訊息,表示找不到Android的資源。

[PAClient Error] Error: E2312 C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\Android\Debug\Project1\AndroidManifest.xml:53: error: Error: No resource found that matches the given name (at 'theme' with value

'@style/CaptureTheme').

8.接下來要合并 Android 和 Embarcadero 的資料檔案

1>.把 Android 的資源複制到項目目錄

PS:這個地方說明一下:注意是編譯後的CaptureActivity\res檔案夾(這裡說的JAVA中的,但不是DLEPHI中的)

把"CaptureActivity\res"中的檔案複制到"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\"中。

2>.打包這些資源檔案

Project->Deployment->把drawable, layout, menu, raw, values 和 xml 目錄下的所有檔案加入->修改"Remote Path"為"Local Path"(如:"res\drawable\"的"Remote Path"為".\"改為"res\drawable\")。

9.接下來因為Zxing和 Embarcadero 都有相同的檔案 res\values\styles.xml,是以要取消其中一個,并手工把兩個檔案的内容合并。

1>.取消官方的Styles.xml

Project->Deployment->Styles.xml去掉對号。

2>.取消官方的classes.dex(20161018親測,去掉閃退,不去掉正好)

Project->Deployment->classes.dex去掉對号。

PS:這個地方說明一下:開始可能沒有官方的classes.dex,但如果發現編譯出錯後,請再檢查一下。

3>.把 (項目目錄)\Android\Debug\styles.xml 和 (項目目錄)\res\values\styles.xml 内容合并後如下

打開notepad,打開檔案"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\Android\Debug\styles.xml",複制如下内容:

<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">

<item name="android:windowBackground">@drawable/splash_image_def</item>

<item name="android:windowNoTitle">true</item>

</style>

打開notepad,打開檔案"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\res\values\styles.xml",粘入複制的内容。位置是在 "<style>"的最後面。

合并結束後,将"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\res\values\styles.xml"整個檔案複制到"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\Android\Debug\"中。

10.增加工程代碼(看博文)

生成二維碼功能

1.将"xZXIngQRCode.pas"檔案放入"C:\Users\zhujq-a\Desktop\Android執行個體之實作掃描二維碼并生成二維碼\"工程代碼目錄下面。

2.在檔案管理器中,選中"project1"->Add->選中xZXIngQRCode.pas->打開。

3.工程單元中引入"xZXIngQRCode"單元。

4.窗體中寫入生成二維碼的代碼(看博文)。

關于橫豎屏的問題

但是android提供的SDK(android.hardware.Camera)裡大概不能正常的使用豎屏(portrait layout)加載照相機,當用豎屏模式加載照相機時會産生以下情況:1. 照相機成像左傾90度(傾斜);2. 照相機成像長寬比例不對(失比)。

基本上解決辦法如下:

1、在AndroidManifest.xml裡面配置一下 ,使CaptureActivity屬性為portrait:   android:screenOrientation="portrait"

2、如果隻是單純的想改變照相機成像的方向,隻需要在包com.google.zxing.client.android.camera下的   CameraConfigurationManager類中增加方法

   protected void setDisplayOrientation(Camera camera, int angle) {

        Method downPolymorphic;

        try {

         downPolymorphic = camera.getClass().getMethod(

           "setDisplayOrientation", new Class[] { int.class });

         if (downPolymorphic != null)

          downPolymorphic.invoke(camera, new Object[] { angle });

        } catch (Exception e1) {

        }

       }

   然後在方法void setDesiredCameraParameters(Camera camera){}中調用,

   setDisplayOrientation(camera, 90);

   具體位置在camera.setParameters(parameters);語句前面。

2014-10-15

樓主上面增加過程的方法在我的(ZXing2.3)CameraConfigurationManager中出錯。

實際隻需setDisplayOrientation(camera, 90);修改成camera.setDisplayOrientation(90);

 3、改變完方向你會發現方向改變了可是分辨率會變得很低,接下來就是優化了

  (1)首先在類CameraManager.java中

   把 rect.left = rect.left * cameraResolution.x / screenResolution.x;

      rect.right = rect.right * cameraResolution.x / screenResolution.x;

      rect.top = rect.top * cameraResolution.y / screenResolution.y;

      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;

   替換成

      rect.left = rect.left * cameraResolution.y / screenResolution.x;

      rect.right = rect.right * cameraResolution.y / screenResolution.x;

      rect.top = rect.top * cameraResolution.x / screenResolution.y;

      rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

   (2)然後是在DecodeHandler類中的方法private void decode(byte[] data,int width,int height){}

   中添加byte[] rotatedData = new byte[data.length];

 for (int y = 0; y < height; y++) {

  for (int x = 0; x < width; x++)

   rotatedData[x * height + height - y - 1] = data[x + y * width];

   *具體内容可見附件

  (3)再就是CameraConfigurationManager類中的方法void initFromCameraParameters(Camera camera){}中添加如下代碼:

Point screenResolutionForCamera = new Point();

    screenResolutionForCamera.x = screenResolution.x;

    screenResolutionForCamera.y = screenResolution.y;

    // preview size is always something like 480*320, other 320*480

 if (screenResolution.x < screenResolution.y) {

  screenResolutionForCamera.x = screenResolution.y;

  screenResolutionForCamera.y = screenResolution.x;

注: 到這就完成了。如果還有問題,隻需下載下傳附件直接替換相應檔案即可;    (直接替換很可能不行)

還有一個最後存在的問題,在 下編譯掃描視窗正常(豎屏),但打包後在DELPHI XE7下,掃描時提示是英文(标題是中文),不知為何?

以上修改之處,是本人環境下完成。

感謝[台北]Q面(2609815930)、[龜山]阿卍(1467948783) 、[北京]老貓(1765535979),還有許多不知名的作者。

執行個體代碼: 

View Code

繼續閱讀