@bigin/ns-firebase
Version:
154 lines (153 loc) • 4.78 kB
JavaScript
import { ImageSource, Utils } from '@nativescript/core';
import { BarcodeFormat, MLKitBarcodeScanner as MLKitBarcodeScannerBase } from './barcodescanning-common';
export { BarcodeFormat };
export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
constructor() {
super(...arguments);
this.inverseThrottle = 0;
}
createDetector() {
let formats;
if (this.formats) {
formats = [];
const requestedFormats = this.formats.split(',');
requestedFormats.forEach((format) => formats.push(BarcodeFormat[format.trim().toUpperCase()]));
}
if (this.beepOnScan) {
AVAudioSession.sharedInstance().setCategoryModeOptionsError(AVAudioSessionCategoryPlayback, AVAudioSessionModeDefault, 1);
const barcodeBundlePath = NSBundle.bundleWithIdentifier('org.nativescript.plugin.firebase.MLKit').bundlePath;
this.player = new AVAudioPlayer({ contentsOfURL: NSURL.fileURLWithPath(barcodeBundlePath + '/beep.caf') });
this.player.numberOfLoops = 1;
this.player.volume = 0.7;
this.player.prepareToPlay();
}
return getBarcodeDetector(formats);
}
createSuccessListener() {
return (barcodes, error) => {
if (error !== null) {
console.log(error.localizedDescription);
} else if (barcodes !== null) {
const result = {
barcodes: [],
};
for (let i = 0, l = barcodes.count; i < l; i++) {
const barcode = barcodes.objectAtIndex(i);
const image = this.lastVisionImage;
let imageWidth = image.size.width;
let imageHeight = image.size.height;
let { x, y } = barcode.frame.origin;
let { width, height } = barcode.frame.size;
if (image) {
const origX = x;
const origWidth = width;
const origImageWidth = imageWidth;
if (Utils.ios.isLandscape()) {
if (UIDevice.currentDevice.orientation === 4) {
x = image.size.width - (width + x);
y = image.size.height - (height + y);
}
} else {
x = image.size.height - (height + y);
y = origX;
width = height;
height = origWidth;
imageWidth = imageHeight;
imageHeight = origImageWidth;
}
}
result.barcodes.push({
value: barcode.rawValue,
displayValue: barcode.displayValue,
format: BarcodeFormat[barcode.format],
ios: barcode,
bounds: {
origin: {
x,
y,
},
size: {
width,
height,
},
},
image: {
width: imageWidth,
height: imageHeight,
},
});
}
this.notify({
eventName: MLKitBarcodeScanner.scanResultEvent,
object: this,
value: result,
});
if (barcodes.count > 0 && this.player) {
this.player.play();
}
}
};
}
rotateRecording() {
return false;
}
preProcessImage(image) {
if (this.supportInverseBarcodes && this.inverseThrottle++ % 2 === 0) {
const filter = CIFilter.filterWithName('CIColorInvert');
let ciImg = CIImage.alloc().initWithImage(image);
filter.setValueForKey(ciImg, kCIInputImageKey);
filter.setDefaults();
ciImg = filter.outputImage;
const context = CIContext.alloc().init();
const cgImg = context.createCGImageFromRect(ciImg, ciImg.extent);
image = UIImage.alloc().initWithCGImage(cgImg);
}
return image;
}
}
function getBarcodeDetector(formats) {
if (formats && formats.length > 0) {
let barcodeFormats = 0;
formats.forEach((format) => (barcodeFormats |= format));
return FIRVision.vision().barcodeDetectorWithOptions(FIRVisionBarcodeDetectorOptions.alloc().initWithFormats(barcodeFormats));
} else {
return FIRVision.vision().barcodeDetector();
}
}
export function scanBarcodesOnDevice(options) {
return new Promise((resolve, reject) => {
try {
const barcodeDetector = getBarcodeDetector(options.formats);
const image = options.image instanceof ImageSource ? options.image.ios : options.image.imageSource.ios;
const firImage = FIRVisionImage.alloc().initWithImage(image);
barcodeDetector.detectInImageCompletion(firImage, (barcodes, error) => {
if (error !== null) {
reject(error.localizedDescription);
} else if (barcodes !== null) {
const result = {
barcodes: [],
};
for (let i = 0, l = barcodes.count; i < l; i++) {
const barcode = barcodes.objectAtIndex(i);
result.barcodes.push({
value: barcode.rawValue,
displayValue: barcode.displayValue,
format: BarcodeFormat[barcode.format],
ios: barcode,
bounds: barcode.frame,
image: {
width: image.size.width,
height: image.size.height,
},
});
}
resolve(result);
}
});
} catch (ex) {
console.log('Error in firebase.mlkit.scanBarcodesOnDevice: ' + ex);
reject(ex);
}
});
}
//# sourceMappingURL=index.ios.js.map