如何使用 Zxing 应用程序在 android 中扫描位图?
Posted
技术标签:
【中文标题】如何使用 Zxing 应用程序在 android 中扫描位图?【英文标题】:How to use Zxing app to scan bitmap in android? 【发布时间】:2016-01-15 08:07:55 【问题描述】:我有一个接收收据照片的应用程序,我想使用 Zxing 来读取此位图并提取 QR 码和条形码信息。那可能吗?如果是的话,你能分享一下android的代码吗?
【问题讨论】:
【参考方案1】:如果您不想坚持使用 Zxing,您可以从 Google Play Service 7.8 版本中获取Barcode Scanning Apis。它具有读取各种条形码的能力。它可以将图像作为位图或实时扫描条形码。假设您从图库中获得了图像并将其转换为位图。请在下面找到使用此库发送要扫描的条形码图像的代码。
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context)
.build();
if(barcode.isOperational())
SparseArray<Barcode> sparseArray = barcodeDetector.detect(frame);
if(sparseArray != null && sparseArray.size() > 0)
for (int i = 0; i < sparseArray.size(); i++)
Log.d(LOG_TAG, "Value: " + sparseArray.valueAt(i).rawValue + "----" + sparseArray.valueAt(i).displayValue);
Toast.makeText(LOG_TAG, sparseArray.valueAt(i).rawValue, Toast.LENGTH_SHORT).show();
else
Log.e(LOG_TAG,"SparseArray null or empty");
else
Log.e(LOG_TAG, "Detector dependencies are not yet downloaded");
在您的 build.gradle 文件中,在依赖项部分下包含以下内容:
compile 'com.google.android.gms:play-services:7.8.+'
并添加以下 Manifest 权限:
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Meta data for google play services: -->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<!-- Meta data for first time install/run time dependencies to be downloaded for getting barcode detector operational -->
<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode" />
关于这个api的详细使用,参考Github Sample,关注Code Lab,Documentation。
【讨论】:
【参考方案2】:您可以使用多种 ZXing 分支。
例如:https://zxingnet.codeplex.com/
// create a barcode reader instance
IBarcodeReader reader = new BarcodeReader();
// load a bitmap
var barcodeBitmap = (Bitmap)Bitmap.LoadFrom("C:\\sample-barcode-image.png");
// detect and decode the barcode inside the bitmap
var result = reader.Decode(barcodeBitmap);
// do something with the result
if (result != null)
txtDecoderType.Text = result.BarcodeFormat.ToString();
txtDecoderContent.Text = result.Text;
【讨论】:
提供的示例是.NET 版本的zxing,在Android 中无法使用。 OP 没有提到 xamarin,所以我认为这无关紧要【参考方案3】:很简单,你需要调用startActivityforResult,类似于调用另一个activity..
在调用扫描时,您需要调用以下操作:
public InvokeScan()
mAppPAckage="com.google.zxing.client.android.SCAN"
Intent intentScan = new Intent(mAppPackage);
intentScan.addCategory(Intent.CATEGORY_DEFAULT);
// set the desired barcode types
intentScan.putExtra("SCAN_FORMATS", stringDesiredBarcodeFormats);
final PackageManager packageManager = activity.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intentScan,
PackageManager.MATCH_DEFAULT_ONLY);
activity.startActivityForResult(intentScan,REQUEST_CODE);
onActivityResult ,你需要捕获结果
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == Activity.RESULT_OK)
String desiredBarCodeFormat = BarCodeActivity.sDesiredBarcodeFormatValue;*/
String contents = intent.getStringExtra(activityBundleName);
String formatName = intent.getStringExtra(desiredBarCodeFormat);
//do whatever you want from contents.
内容将是您需要的条形码编号。
【讨论】:
您好 Ashish Rawat,感谢您提出问题,但我正在寻找一种方法将手机中已有的图片发送到 Zxing 以获得条形码。你知道如何实现这一目标吗?谢谢。以上是关于如何使用 Zxing 应用程序在 android 中扫描位图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android zxing 中扫描带有嵌入权重的条码