Android 条码/二维码阅读器

7

我希望在我的应用程序中实现一个QR码/条形码阅读器。我想知道最轻量级的解决方案是什么(不考虑zxing的意图集成器)。


2
ZXing 的 Intent Integrator 出了什么问题? - kjurkovic
2
我不希望用户离开应用程序去下载条形码扫描器,我希望在应用程序内找到一个解决方案。 - user1437481
Zxing 提供完整的代码,您可以将其集成到您的应用程序中。 - Anand Tiwari
1
您可以将zxing作为应用程序的一部分。只需将其添加为库并使用调用捕获意图即可。 - Adrián Rodríguez
我知道意图是最好的选择,因为Android允许这种“模块化”编码,但这不是我的应用程序,我只是在按照指示操作。我正在寻找另一种解决方案。 - user1437481
显示剩余5条评论
3个回答

10

我使用了zxing将其集成到我的应用程序中。您需要一些编码技巧。首先在构建路径中包含core.jar,它位于core / core.jar中,然后进入他们的客户端,即android /..../com.google.zxing,并获取他们的代码(这不是开发人员建议的操作,因为这样会复制和粘贴他人的代码)。最后,添加以下代码:

   package com.wtsang02.activities;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.common.HybridBinarizer;


public class QRDecoder extends Activity implements OnClickListener {

    private String text;
    private Button webbutton;
    private Bitmap bmp;
    private ImageView ivPicture;
    private TextView textv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mysales);
        webbutton = (Button)findViewById(R.id.webbutton);

        ivPicture = (ImageView) findViewById(R.id.ivPicture);
        textv= (TextView) findViewById(R.id.mytext);

        webbutton.setOnClickListener(this);
    }

    private void decode() {


        if (bmp == null) {
            Log.i("tag", "wtf");
        }
        bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);

        int[] intArray = new int[bmp.getWidth() * bmp.getHeight()];
        bmp.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(),
                bmp.getHeight());

        LuminanceSource source = new com.google.zxing.RGBLuminanceSource(
                bmp.getWidth(), bmp.getHeight(), intArray);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        Reader reader = new MultiFormatReader();
        try {
            Result result = reader.decode(bitmap);

            text = result.getText();
            byte[] rawBytes = result.getRawBytes();
            BarcodeFormat format = result.getBarcodeFormat();
            ResultPoint[] points = result.getResultPoints();
            textv.setText(text);

        } catch (NotFoundException e) {

            e.printStackTrace();
        } catch (ChecksumException e) {

            e.printStackTrace();
        } catch (FormatException e) {

            e.printStackTrace();

        }
        Log.i("done", "done");
        if(text!=null)
        Toast.makeText(getBaseContext(), text, Toast.LENGTH_LONG).show();
        else{
            Toast.makeText(getBaseContext(), "QQ", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onClick(View v) {

        Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(i, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            bmp = (Bitmap) extras.get("data");
            ivPicture.setImageBitmap(bmp);
            decode();
        }

    }

}

这段代码将使用您手机的默认相机,如果需要使用特定应用程序的相机,您需要启动他们的 CaptureActivity。您的布局应包括一个 TextView 以显示结果,ImageView 以显示您拍摄的图像,以及一个Button 以启动相机。这是基于2.1zxing。


展示如何构建一个简单的新应用程序,而不是完全复制条形码扫描器应用程序,这样做会得到+1。 - Sean Owen
1
这段代码一启动就抛出异常,导致应用程序崩溃 :( - tejas
在编写这些代码时,要求我添加com.google.zxing.NotFoundException异常:LuminanceSource source = new RGBLuminanceSource(200, 200, intArray); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new MultiFormatReader(); Result result = reader.decode(bitmap); - tejas
我按照您提供的确切步骤进行操作。图像已被捕获并设置到ImageView中,但在解码时出现问题,字符串文本变为空,并执行else块。 - tejas
如果你得到了NotFoundExcetion异常,有两个原因:1)你是否正确导入了库?2)你是否将Activity添加到了清单文件中?由于这段代码在我的设备上可以正常工作,我认为问题不在代码上。 - wtsang02
显示剩余3条评论

2

您可以使用以下工具:

  • zbar(SDK提供了很好的示例)。
  • zxing

0

嘿,从这个链接下载Biggu条形码扫描器的示例,提取演示项目并将其导入到Eclipse中。该zip文件包含演示示例,您可以根据自己的要求在应用程序中使用和集成它。


一会儿我会试一下。 - user1437481
这个似乎无法只选择QR码或条形码。 - user1437481

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接