使用ZXing IntentIntegrator进行间歇性QR扫描结果

时间:2014-03-07 16:57:57

标签: android zxing qr-code

我在尝试之前尽力找到解决方案,然而,我似乎无法找到类似的情况。

我为我正在处理的应用程序实施了QR扫描程序。我正在使用zxing库,特别是使用下面的导入。此外,应用程序使用Play商店中的“条形码扫描仪”(我被提示安装)。

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

问题是扫描仪每3-6次扫描只能运行1次。我得到一个null返回,或没有输出。它总是返回我的源屏幕,从不产生实际错误。

我将本教程用作来源:Android SDK: Create a Barcode Reader

以下是mainactivity的相关信息:

    public void onClick(View v){
            //respond to clicks
            if(v.getId()==R.id.scanQRButton){
                //scan
                IntentIntegrator scanIntegrator = new IntentIntegrator(this);
                scanIntegrator.initiateScan();
                formatTxt.setText( "Scan Initiated");
                contentTxt.setText(" Scan Results: " + scanContent);

                if(scanContent != null){

                    String userid,medname,tabstaken,dob;


                    StringTokenizer st = new StringTokenizer(scanContent, ",");
                         // token 0
                         dob = st.nextToken();
                         //token 1
                         medname = st.nextToken();
                         //token 2
                         tabstaken = st.nextToken();
                         //token 3
                         //rxnumber

                    DatabaseHandler db = new DatabaseHandler(getApplicationContext());

                    HashMap<String,String> user = new HashMap<String, String>();
                    user = db.getUserDetails();

                    //Store the userlog by passing to UserLogEntry
                    userid = user.get("uid");
                    //debug.setText("Userid: "+ userid+ " medname: " + medname + " tabs: " +tabstaken);

                    UserLogEntry userlog = new UserLogEntry(getApplicationContext(),userid,medname,tabstaken);
                    userlog.addUserLog();



                }



            }

        }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        //retrieve scan result
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

        if (scanningResult != null) {
            //we have a result
            scanContent = scanningResult.getContents();



        }
        else{
            Toast toast = Toast.makeText(getApplicationContext(), 
                "No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }


}

以下是我正在使用的库包中的ZXing类:

IntentResults:

https://code.google.com/p/zxing/source/browse/trunk/android-integration/src/com/google/zxing/integration/android/IntentResult.java?r=1273

IntentIntegrator:

https://code.google.com/p/zxing/source/browse/trunk/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java?spec=svn2260&r=2260

关于如何在100%的时间内使用此功能的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:3)

所以我尝试了几种不同的方法让扫描仪与zxing一起工作,没有任何方法可行。无论我做了什么,它都感觉到了马车。除了集成扫描仪以便它不需要第三方应用程序(如在条形码扫描仪中)这一事实之外,这是一个巨大的痛苦。我决定寻找替代方案并找到ZBar。

如果有人使用zxing进行QR扫描有任何问题,我建议改用Zbar。代码本身更简单。您可以使用zbar页面上给出的示例,并将其复制并粘贴到您的项目中,而无需进行任何更改(或非常少)。此外,将其整合为全包式扫描仪很简单。

我在这里附上说明,以获得更具包容性的答案。这些信息可以在教程和ZBar页面中找到,但是,在我的答案中将它们包括在内并不会有什么坏处。

  1. 首先在此处下载zip:https://github.com/dm77/ZBarScanner
  2. 然后添加&#34; ZBarScannerLibrary&#34;作为现有的android项目。
  3. 对于ZBarScannerLibrary:右击 - &gt; properties-&gt; android并检查&#34; Is Library&#34;
  4. 选择您的项目(您要将qr扫描仪添加到的项目),右击 - &gt;属性 - &gt; android-&gt;添加选择ZBarScannerLibrary。
  5. 现在添加页面上给出的ZBar代码:https://github.com/dm77/ZBarScanner(如下所示是有帮助的。
  6. 在不拉扯头发的情况下享受qr扫描
  7. 以下是ZBar提供的样本的主要活动。不要忘记在android清单中添加适当的行:

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" />
    

    在application元素中,添加活动声明:

    <activity android:name="com.dm.zbar.android.scanner.ZBarScannerActivity"
            android:screenOrientation="landscape"
            android:label="@string/app_name" />
    

    我使用字符串标记来拉开QR结果并将它们分类为特定变量。

        package com.dm.zbar.android.examples;
    
        import android.app.Activity;
        import android.content.Intent;
        import android.content.pm.PackageManager;
        import android.os.Bundle;
        import android.text.TextUtils;
        import android.view.View;
        import android.widget.Toast;
        import com.dm.zbar.android.scanner.ZBarConstants;
        import com.dm.zbar.android.scanner.ZBarScannerActivity;
        import net.sourceforge.zbar.Symbol;
    
        public class MainActivity extends Activity {
    
        private static final int ZBAR_SCANNER_REQUEST = 0;
        private static final int ZBAR_QR_SCANNER_REQUEST = 1;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    
        public void launchScanner(View v) {
            if (isCameraAvailable()) {
                Intent intent = new Intent(this, ZBarScannerActivity.class);
                startActivityForResult(intent, ZBAR_SCANNER_REQUEST);
            } else {
                Toast.makeText(this, "Rear Facing Camera Unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    
        public void launchQRScanner(View v) {
            if (isCameraAvailable()) {
                Intent intent = new Intent(this, ZBarScannerActivity.class);
                intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE});
                startActivityForResult(intent, ZBAR_SCANNER_REQUEST);
            } else {
                Toast.makeText(this, "Rear Facing Camera Unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    
        public boolean isCameraAvailable() {
            PackageManager pm = getPackageManager();
            return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
                case ZBAR_SCANNER_REQUEST:
                case ZBAR_QR_SCANNER_REQUEST:
                    if (resultCode == RESULT_OK) {
                        Toast.makeText(this, "Scan Result = " + data.getStringExtra(ZBarConstants.SCAN_RESULT), Toast.LENGTH_SHORT).show();
                    } else if(resultCode == RESULT_CANCELED && data != null) {
                        String error = data.getStringExtra(ZBarConstants.ERROR_INFO);
                        if(!TextUtils.isEmpty(error)) {
                            Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
                        }
                    }
                    break;
            }
        }
    }