在Android中实施条形码扫描程序

时间:2011-06-13 07:03:38

标签: android

我正在Android中创建一个读取条形码扫描器的应用程序。

我有没有办法实现条形码扫描器?

应用程序应打开相机并拍摄条形码图像。

扫描完成后,它会向我提供我将发送到我的服务以在我的数据库中搜索的代码。

我怎样才能做到这一点?

更新:

我要将此文件IntentIntegrator.java集成。

我如何使用此API?

9 个答案:

答案 0 :(得分:10)

2016年更新

目前的建议是使用Android Barcode APIlocally(离线),without需要服务器往返。该API是2015年8月Mobile Vision API, released with Google Play Services 7.8的一部分。

  

条形码API可以在设备上以任何方向实时检测条形码。它还可以同时检测多个条形码。

     

它读取以下条形码格式:

     
      
  • 1D条码:EAN-13,EAN-8,UPC-A,UPC-E,Code-39,Code-93,Code-128,ITF,Codabar
  •   
  • 二维条码:二维码,数据矩阵,PDF-417,AZTEC
  •   
     

它会自动解析QR码,数据矩阵,PDF-417和Aztec值,以支持以下格式:

     
      
  • URL
  •   
  • 联系信息(VCARD等)
  •   
  • 日历活动
  •   
  • 电子邮件
  •   
  • 电话
  •   
  • SMS
  •   
  • ISBN
  •   
  • 无线网络
  •   
  • 地理位置(经度和纬度)
  •   
  • AAMVA驾驶执照/ ID
  •   

答案 1 :(得分:5)

尝试 Zxing

  ZXing(发音为“斑马线”)是   开源,多格式1D / 2D   条码图像处理库   用Java实现。我们的重点是   在移动设备上使用内置摄像头   手机拍照和解码   设备上的条形码,没有   与服务器通信。

答案 2 :(得分:2)

我强烈建议您使用此库:https://github.com/dm77/barcodescanner

它会消除您尝试直接集成XZing或Zbar时遇到的所有疯狂构建问题。它使用了这些库,但它将它们包装在一个非常简单易用的API中。

答案 3 :(得分:1)

如果您想要包含代码而不使用ZXing库推荐的IntegratorIntent,您可以使用其中一些端口:

我使用第一个,它完美无缺!

答案 4 :(得分:1)

我也试图这样做,但是在R& D期间,我发现许多用于扫描QR码和条形码的库。一些在下面给出:

  1. QRGenerator

  2. QRParserLib

  3. QRGen

  4. qreader

  5. QRCodeReaderView

  6. barcodescanner

  7. android-quick-response-code

  8. MaterialBarcodeScanner

  9. 所以你可以使用任何一个。

答案 5 :(得分:0)

使用zxing库。代码和示例可以在该网站上找到。

答案 6 :(得分:0)

在互联网上寻找ZXing的替代品,我找到了Zbar。 事实是,我知道它适用于iOS,但我不知道它也适用于Android。

事实是,ZXing最糟糕的是它非常慢并且加载了很多应用程序。

Zbar,是一个JAR文件。它复制在库中,然后导入其他项目......非常好。

答案 7 :(得分:0)

  

ZXing(发音为"斑马线")是一个用Java实现的开源,多格式1D / 2D条形码图像处理库。我们的重点是使用手机上的内置摄像头拍摄和解码设备上的条形码,而无需与服务器通信。

代码

compile 'me.dm7.barcodescanner:zxing:1.8.4'


import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

import com.google.zxing.Result;

import org.json.JSONException;
import org.json.JSONObject;

import java.net.NetworkInterface;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import me.dm7.barcodescanner.zxing.ZXingScannerView;

public class MainActivity extends Activity implements ZXingScannerView.ResultHandler {

    private ZXingScannerView mScannerView;
    String locationAddress;

    private Dialog mDialog;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TODO: Android 6.0 (Marshmallow) permissions

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CAMERA);

            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                Log.e("permission", "granted");
                //callLocation();
            }
            else {
                ActivityCompat.requestPermissions(
                    MainActivity.this,
                    new String[] { Manifest.permission.CAMERA,
                                   Manifest.permission.ACCESS_FINE_LOCATION,
                                   Manifest.permission.ACCESS_COARSE_LOCATION
                                 },
                    1);
            }
        }
        else {
            Log.e("MainActivity", "Lower Than Marshmallow");
        }
    }

    public void onClick(View v) {

        mScannerView = new ZXingScannerView(this);
        setContentView(mScannerView);
        mScannerView.setResultHandler(this);
        mScannerView.startCamera();
        Log.w("MainActivity", "onClick");
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mScannerView != null) {
            mScannerView.stopCamera();
            Intent i = new Intent(MainActivity.this, MainActivity.class);
            startActivity(i);
        }
        Log.w("MainActivity", "onPause");
    }

    @Override
    public void handleResult(Result result) {

        // Do anything with 'result' here :D
        Log.w("MainActivity", "handleResult" + result.getText());

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Scan result");
        builder.setMessage(result.getText());
        AlertDialog alertDialog = builder.create();
        alertDialog.show();

        if (CommonMethod.isNetworkAvailable(MainActivity.this)) {
            send(result.getText());
        }

        //Resume scanning
        //mScannerView.resumeCameraPreview(this);
    }

}

。 。

    @Override
    protected void onResume() {
        super.onResume();

        Log.e("Keshav", "MainActivity onResume called ");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int permissionCheck = ContextCompat.checkSelfPermission(
                                      MainActivity.this,
                                      Manifest.permission.CAMERA);

            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                Log.e("permission", "granted");
                    //callLocation();
            }
            else {
                ActivityCompat.requestPermissions(
                    MainActivity.this,
                    new String[] { Manifest.permission.CAMERA,
                                   Manifest.permission.ACCESS_FINE_LOCATION,
                                   Manifest.permission.ACCESS_COARSE_LOCATION},
                    1);
            }
        }
        else {
            Log.e("MainActivity on Resume ", "Lower Than Marshmallow");
        }
    }
}

答案 8 :(得分:0)

编辑build.gradle(App)文件&添加以下依赖项:

compile 'com.journeyapps:zxing-android-embedded:3.4.0'

在Activity类中声明以下变量:

IntentIntegrator qrScan

在OnCreate方法中写下以下代码:

    qrScan = new IntentIntegrator(this);
qrScan.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);

创建一个按钮,按钮功能如下:

  public void startScan(View view) {
qrScan.initiateScan();
}

现在它将开始扫描,但它需要以下方法来读取结果:所以在同一个Activity下面的OnActivityResult方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
    if (result.getContents() == null) {
        Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, result.getContents() ,Toast.LENGTH_LONG).show();
        txt.setText(result.getContents());
        qrScan.initiateScan();
    }
}

}

不要忘记创建按钮& TextView在同一Activity的XML文件中。 请参考下面的链接,它将以简单的形式给你更多的想法。 https://www.simplifiedcoding.net/android-qr-code-scanner-tutorial/