Implementing QR Code Scanning with Camera, Media Library, and Image Processing in HarmonyOS
Overview
This implemantation demonstrates QR code scanning using camera capture and media library integration. It supports real-time decoding from the camera feed and parsing QR codes from images selected from the device’s photo gallery.
Key Features
- Real-time QR code detection via camera stream
- Manual image selection from the media library
- Image processing pipeline for decoding
- File system handling for temporary storage
Project Structure
Feature/src/main/ets/
|---qrcodescan
| |---components
| | |---QRCodeScanComponent // UI component for scanning interface
| |---CameraService.ets // Camera management logic
| |---QRCodeParse.ets // QR decoding service
| |---QRCodeScanConst.ets // Constants for scanning configuration
|---utils
| |---DateTimeUtil.ets // Utility for timestamp generation
| |---Logger.ts // Logging framework
Camera Integration
The CameraService class handles all camera operations:
-
Initialize Camera Manager
const cameraManager = getCameraManager(); const availableCameras = await cameraManager.getSupportedCameras(); -
Open Camera Device
const cameraInput = cameraManager.createCameraInput(availableCameras[0].id); await cameraInput.open(); -
Configure Output Streams
- Query supported output formats using
getSupportedOutputCapability - Create preview output with
createPreviewOutput - Initialize photo output using
createPhotoOutputfrom@ohos.multimedia.image
- Query supported output formats using
-
Start Capture Session
const session = cameraManager.createCaptureSession(); session.beginConfig(); session.addInput(cameraInput); session.addOutput(previewOutput); session.addOutput(photoOutput); await session.commitConfig(); session.start();
Image Processing & QR Decoding
The QRCodeParse module manages image analysis:
-
Capture Image from Camera
- Register callback on
cameraService.imageReceiver.on - Retrieve image buffer via
readNextImage - Extract pixel data using
getComponentbased on image format - Save to temporary file and generate URI
- Convert URI to
ImageBitmapusingImageBitmap.fromURI
- Register callback on
-
Select Image from Media Library
- Launch media picker with
startAbilityForResult - Receive selected image URI
- Convert to
ImageBitmapfor processing
- Launch media picker with
-
Decode QR Code
- Use
CanvasRenderingContext2D.getImageData()to extract raw pixel data asImageData - Convert to 8-bit grayscale array
- Pass to
jsQRlibrary for decoding - Return decoded payload or error message
- Use
Required Permissions
ohos.permission.READ_MEDIAohos.permission.CAMERAohos.permission.MEDIA_LOCATION
Dependencies
None — relies solely on built-in HarmonyOS APIs.
Constraints
- Runs only on standard system images (e.g., RK3568 platform).
- Built using Stage model with API Level 10 SDK (API Version 10 Release).
- Requires Full SDK (4.0 Release) for compilation.
- Compatible with DevEco Studio 4.0 Release and above.
- Uses system_core-level permissions — requires manual signing with appropriate certificate.
- Must be declared as a system application (
app-feature: "hos_system_app") inprofileconfiguration.
Download Instructions
To clone this sample project:
git init
git config core.sparsecheckout true
echo code/BasicFeature/Media/QRCodeScan/ > .git/info/sparse-checkout
git remote add origin https://gitee.com/openharmony/applications_app_samples.git
git pull origin master
For comprehensive learning resources on HarmonyOS development, including ArkTS, TypeScript, and ArkUI tutorials, visit: HarmonyOS Learning Hub