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.