【问题标题】:Integrating ZXing into application将 ZXing 集成到应用程序中
【发布时间】:2023-03-18 22:20:01
【问题描述】:

这似乎与许多现有的类似问题重复。但我已经阅读了几乎所有的讨论,没有一个是有帮助的。我的目标是将 zxing 库嵌入到我的应用程序中,并在不需要引用外部应用程序的情况下扫描二维码。我当前的目标平台是 android 4.2。

我一遍又一遍地完成了以下步骤:

  1. 下载zxing-2.3.0源码
  2. 使用 Maven 编译 zxing-2.3.0/core - 得到 core-2.3.0.jar
  3. 使用 zxing-2.3.0/android/ 创建了一个新项目,将 core-2.3.0.jar 添加到 /libs 文件夹,将 switch 语句更改为 if{} 子句,从 CaptureActivity 中删除 final,标记为 library,build = captureactivity.jar
  4. 返回到我原来的应用程序。将 core-2.3.0.jar 和 captureactivity.jar 添加到我的 /libs 文件夹中。
  5. 还在 Properties/Java Build Path/Libraries/Add JARS/.. 下添加了 libs/captureactivity.jar 作为库(不过这没有区别,即使我不这样做,我也会得到同样的错误)
  6. 我创建了一个名为 ScannerActivity 的类来扩展 CaptureActivity(详情如下)

当我运行应用程序时,我看到 dalvikvm 解决了很多资源问题,然后才最终得到异常。据我了解/测试 zxing 库在编译为库时无法访问本地资源文件或静态变量。它最终会因 NoClassDefFoundError 试图定位 CaptureActivity 的 RelativeLayout 而崩溃。

这是我得到的错误类型的简化列表。

01-04 23:30:37.851: W/dalvikvm(9804): VFY: unable to resolve static field 1711 (decode_succeeded) in Lcom/google/zxing/client/android/R$id;
01-04 23:30:37.851: D/dalvikvm(9804): VFY: replacing opcode 0x60 at 0x0011
01-04 23:30:37.851: W/dalvikvm(9804): VFY: unable to resolve static field 1761 (app_name) in Lcom/google/zxing/client/android/R$string;
01-04 23:30:37.851: D/dalvikvm(9804): VFY: replacing opcode 0x60 at 0x0005
..................(more of similar)
01-04 23:30:37.875: I/dalvikvm(9804): DexOpt: unable to optimize static field ref 0x0702 at 0x0e in Lcom/google/zxing/client/android CaptureActivity;.displayFrameworkBugMessageAndExit
01-04 23:30:37.875: I/dalvikvm(9804): DexOpt: unable to optimize static field ref 0x06eb at 0x17 in Lcom/google/zxing/client/android/CaptureActivity;.displayFrameworkBugMessageAndExit
..................(more of similar)
01-04 23:30:43.617: E/AndroidRuntime(9804): FATAL EXCEPTION: main
01-04 23:30:43.617: E/AndroidRuntime(9804): java.lang.NoClassDefFoundError: com.google.zxing.client.android.R$layout
01-04 23:30:43.617: E/AndroidRuntime(9804):     at com.google.zxing.client.android.CaptureActivity.onCreate(CaptureActivity.java:134)
..................(rest of exception stack)


package my.android.application;

import my.android.ordertaker.R;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.Toast;

import com.google.zxing.Result;
import com.google.zxing.client.android.CaptureActivity;

public class ScannerActivity extends CaptureActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scanner);
    }

    @Override
    public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
        Toast.makeText(this.getApplicationContext(), "Scanned code " + rawResult.getText(), Toast.LENGTH_LONG);
    }
}

这里是 AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.android.ordertaker"
    android:versionCode="3"
    android:versionName="3.0" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- uses-permission android:name="android.permission.ACCESS_WIFI_STATE" / -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />
    <!-- android:theme="@style/AppTheme" -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/CustomTheme" >

        <activity
            android:name="my.android.application.ScannerActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- service android:name="com.commonsware.cwac.updater.UpdateService"/ -->
        <!-- receiver android:name="com.commonsware.cwac.updater.WakefulReceiver"/ -->

        <receiver android:name="my.android.io.NetworkStatusListener" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" >
                </action>
            </intent-filter>
        </receiver>
    </application>

</manifest>

我还尝试了什么:我通过修改它来使用 zxing /android 源 (captureactivity.jar),尝试使用直接值(硬编码)删除 R.id 引用,拉出一些类来我自己的项目,将一些源访问器更改为公共等,我在这方面取得了一些成功,我什至让相机工作,但最后我无法管理它,范围太大而无法处理,所以我恢复了。

根据我的经验,问题似乎源于生成的库(captureactivity.jar)无法引用它的内部资源,但我可能错了。我的问题似乎比技术更根本。我做错了什么?

【问题讨论】:

  • 您是否尝试将其用作 Android 库项目而不是 JAR?
  • 你能指导我怎么做吗?我已经在 xzing 的 ouf /android 文件夹中创建了一个项目,修复了错误并将其标记为库。然后我把它放到我的主应用程序的 libs 文件夹中。然后我还通过 Properties/Java Build Path/Libraries 的“Add Jar”按钮将它添加为库。我错过了什么步骤?
  • 既然您已经提到它,我将 CaptureActivity 项目添加到我的工作区,删除了您提到的 jar,并将 CaptureActivity 作为库添加到我的项目中。错误的性质已经改变。 CaptureActivity.onResume 正在引发 NullPointerException。我将进一步调查并发布结果。感谢领导。
  • 这帮助我解决了问题,现在我可以看到原因,但我仍然不知道解决方案。正如我之前猜测的那样,资源文件ID存在问题。 Capture 活动的 onResume() 函数试图从布局中定位 ViewfinderView,但引用返回 null。 viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
  • 库项目中的所有 R.id 都在 findViewById(R.id.xxx) 中返回空对象。这就是我站在atm的地方。任何帮助表示赞赏。

标签: android zxing


【解决方案1】:

首先将 ZXing 项目作为一个库项目来处理资源问题。正如@SeanOwen 指出的那样,如果您打算将 UI 与适当的属性一起分发,则需要更改 UI。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多