我正在Android中创建一个读取条形码扫描器的应用程序。
我有没有办法实现条形码扫描器?
应用程序应打开相机并拍摄条形码图像。
扫描完成后,它会向我提供我将发送到我的服务以在我的数据库中搜索的代码。
我怎样才能做到这一点?
更新:
我要将此文件IntentIntegrator.java集成。
我如何使用此API?
答案 0 :(得分:10)
目前的建议是使用Android Barcode API,locally(离线),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码和条形码的库。一些在下面给出:
答案 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/