如何使用 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开发 如何实现扫描本地二维码图片

如何在 android zxing 中扫描带有嵌入权重的条码

在安卓应用中嵌入 ZXing

使用 zxing 读取 9 个扩展条码中的 3 个 - 在 Android 中

Android在zxing库中启动flash

如何将 ZXing 库集成到 Android Studio 进行条码扫描?