Android 将ZXing集成到应用中

Android 将ZXing集成到应用中,android,zxing,Android,Zxing,这似乎是许多现有类似问题的重复。但我读过几乎所有的讨论,没有一个是有帮助的。我的目标是将zxing库嵌入到我的应用程序中,并在不需要引用外部应用程序的情况下扫描QRCodes。我目前的目标平台是安卓4.2 我已经一遍又一遍地完成了以下步骤: 下载zxing-2.3.0源代码 使用Maven编译zxing-2.3.0/core-获得core-2.3.0.jar 使用zxing-2.3.0/android/创建了一个新项目,将core-2.3.0.jar添加到/libs文件夹,将switch语句更改

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

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

  • 下载zxing-2.3.0源代码
  • 使用Maven编译zxing-2.3.0/core-获得core-2.3.0.jar
  • 使用zxing-2.3.0/android/创建了一个新项目,将core-2.3.0.jar添加到/libs文件夹,将switch语句更改为if{}子句,从CaptureActivity中删除final,标记为library,build=CaptureActivity.jar
  • 返回到我原来的应用程序。将core-2.3.0.jar和captureactivity.jar添加到my/libs文件夹中
  • 还将libs/captureactivity.jar作为库添加到Properties/Java Build Path/Libraries/Add JARS/下。。(虽然这没有什么区别,但即使我没有,我也会得到相同的错误)
  • 我创建了一个名为ScanneActivity extending CaptureActivity的类(详细信息如下)
  • 当我运行应用程序时,我看到很多资源在最终得到异常之前解决了来自dalvikvm的问题。据我所知/测试zxing库在编译为库时无法访问的是本地资源文件或静态变量。它最终会在试图找到CaptureActivity的RelativeLayout时发生NoClassDefFoundError错误

    下面是我得到的错误类型的简化列表

    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引用(硬编码),将一些类拉到我自己的项目中,将一些源代码访问器更改为public等等,我在这方面取得了一些成功,我甚至让相机正常工作,但最后我无法管理它,因为范围太大,无法处理,所以我返回


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

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

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