Developing Android Barcode Scanning Applications with ZXing

Nov 25, 2025 · Programming · 10 views · 7.8

Keywords: Android | ZXing | Barcode Scanning | Intent Integration | Direct Integration

Abstract: This comprehensive guide explores the complete implementation of ZXing barcode scanning functionality in Android applications. It begins with the straightforward approach of invoking standalone ZXing applications via Intents, covering intent configuration, result handling, and error management. The article then delves into advanced integration methods by directly embedding ZXing core libraries, including project setup, dependency management, permission handling, and UI customization. A comparative analysis of different integration approaches is provided, along with modern Android development best practices and recommendations for using the zxing-android-embedded library to streamline development.

ZXing Barcode Scanning Technology Overview

ZXing (Zebra Crossing) is an open-source barcode processing library that supports generation and recognition of multiple barcode formats. On the Android platform, ZXing offers flexible integration options, allowing developers to choose appropriate approaches based on application requirements.

Invoking ZXing Applications via Intent

The simplest approach involves using Android's Intent mechanism to call installed ZXing barcode scanning applications. This method requires minimal code but depends on the presence of ZXing applications on user devices.

public Button.OnClickListener mScan = new Button.OnClickListener() {
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
    }
};

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            // Handle successful scan results
        } else if (resultCode == RESULT_CANCELED) {
            // Handle user cancellation
        }
    }
}

While straightforward, this approach has significant limitations: calls will fail if ZXing applications are not installed on user devices. The ZXing project provides IntentIntegrator utility classes to handle such scenarios by guiding users to install ZXing applications.

Direct Integration of ZXing Core Libraries

For applications requiring complete control over scanning experiences, ZXing core libraries can be directly integrated into projects. This approach eliminates external application dependencies but requires more configuration effort.

Project Configuration Steps

ZXing integration involves several configuration steps: downloading ZXing source code, importing Android projects, adding core library dependencies, and configuring compilation environments. Note that certain ZXing versions require Java 1.7 or higher with corresponding Android SDK support.

Dependency Management

Modern Android development recommends using Gradle for dependency management. For the zxing-android-embedded library, add to build.gradle:

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
}

Additional configuration is required for lower SDK version support:

android {
    defaultConfig {
        minSdkVersion 19
        multiDexEnabled true
    }
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
    implementation "androidx.multidex:multidex:2.0.1"
}

Modern Android Development Best Practices

With evolving Android development standards, startActivityForResult has been deprecated. Use registerForActivityResult instead:

private final ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),
    result -> {
        if(result.getContents() == null) {
            // Handle cancellation
        } else {
            // Process scan results
        }
    });

public void onButtonClick(View view) {
    barcodeLauncher.launch(new ScanOptions());
}

Scanning Options Customization

The zxing-android-embedded library provides extensive scanning option customization:

ScanOptions options = new ScanOptions();
options.setDesiredBarcodeFormats(ScanOptions.ONE_D_CODE_TYPES);
options.setPrompt("Scan a barcode");
options.setCameraId(0);
options.setBeepEnabled(false);
options.setBarcodeImageEnabled(true);
barcodeLauncher.launch(options);

Permission Handling

Camera permissions are essential for barcode scanning functionality. The library automatically handles permission requests, but manual permission management is required when using BarcodeView directly:

<uses-permission android:name="android.permission.CAMERA" />

Hardware Acceleration Configuration

Hardware acceleration must be enabled in AndroidManifest.xml due to TextureView usage:

<application android:hardwareAccelerated="true" ... >

Barcode Generation Capabilities

Beyond scanning functionality, ZXing supports barcode generation:

try {
    BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
    Bitmap bitmap = barcodeEncoder.encodeBitmap("content", BarcodeFormat.QR_CODE, 400, 400);
    ImageView imageViewQrCode = (ImageView) findViewById(R.id.qrCode);
    imageViewQrCode.setImageBitmap(bitmap);
} catch(Exception e) {
    // Handle exceptions
}

Integration Approach Comparison

Intent-based invocation suits rapid prototyping and scenarios with lower user experience requirements. Direct integration offers superior user experiences and higher customization flexibility but increases development complexity. The zxing-android-embedded library strikes an optimal balance, maintaining usability while providing adequate customization capabilities.

Performance Optimization Recommendations

In practical development, process camera operations in background threads to improve startup speed. Properly manage camera lifecycles and promptly release resources. For frequent scanning scenarios, consider pre-initializing scanning components.

Compatibility Considerations

Compatibility across different Android versions and devices requires careful consideration. Conduct thorough testing on target devices, particularly compatibility testing for camera resolution and autofocus functionality.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.