Code Monkey home page Code Monkey logo

tabris-plugin-barcode-scanner's Introduction

Tabris.js Barcode Scanner Plugin

A barcode scanner widget for Tabris.js, allowing to scan various types of barcodes.

barcode scanner screenshots

General usage

The plugin provides a BarcodeScannerView which can be embedded into the Tabris.js view hierarchy like any other view. Once embedded it shows a blank screen until the start() method is called. At that point the device camera is displayed in the view bounds and barcode detection is activated. The detect event will fire when a barcode is detected in the camera view. The callback might fire multiple times for the same barcode. Barcode scanning continues until stop() is called which also deactivates the camera. It is recommended to stop barcode detection when not needed as it draws considerable power.

Supported barcode formats

The plugin supports the following barcode formats.

Barcode Name iOS Android
UPC-A upcA
UPC-E upcE
Code 39 code39
Code 39 Mod 43 code39Mod43
Code93 code93
Code128 code128
EAN-8 ean8
EAN-13 ean13
PDF417 pdf417
QR qr
Aztec aztec
Interleaved 2 of 5 interleaved2of5
ITF14 itf
DataMatrix dataMatrix
Codabar codabar

Example

The following snippet shows how the tabris-plugin-barcode-scanner plugin can be used in a Tabris.js app:

let scanner = new esbarcodescanner.BarcodeScannerView({
  left: 0, right: 0, top: 0, bottom: 0
}).on('detect', (e) => console.log(`Detected ${e.format} code with data ${e.data}`))
  .on('error', (e) => console.log(e.error))
  .appendTo(tabris.ui.contentView);
scanner.start(['qr', 'ean13']);

A more elaborate example can be found in the example folder. It provides a Tabris.js project that demonstrates the various features of the tabris-plugin-barcode-scanner widget. Consult the README of the example for build instructions.

Integrating the plugin

The Tabris.js website provides detailed information on how to integrate custom widgets in your Tabris.js app. To add the plugin to your app add the following entry in your apps config.xml:

<plugin name="tabris-plugin-barcode-scanner" spec="3.x" />

To fetch the latest development version use the GitHub URL:

<plugin name="tabris-plugin-barcode-scanner" spec="https://github.com/eclipsesource/tabris-plugin-barcode-scanner.git" />

iOS

The plugin requires key-value entry. NSCameraUsageDescription with description has to be added to the Info.plist file of your app to work correctly. Please include this configuration in your config.xml file.

<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
  <string>Your custom description.</string>
</edit-config>

API

The widget api consists of the object esbarcodescanner.BarcodeScannerView with the following properties, events and methods.

Properties

The following properties can be applied in addition to the [common Tabris.js widget properties](https://tabrisjs .com/documentation/latest/api/Widget#properties):

camera : string, supported values: front, back, default: back

The camera to use when scanning for barcodes. Has to be set in the constructor of the BarcodeScannerView.

scaleMode : string, supported values: fit, fill, default: fit

How to scale the camera frame inside the bounds of the BarcodeScannerView. Setting the scaleMode to fit shows the full camera frame while potentially leaving blank space on the sides. Setting the scaleMode to fill will make the camera frame cover the view bounds while potentially clipping some of the camera frame edges.

active : boolean, readonly

Calling start() sets the active property to true. Calling stop() sets the active property to false. When an error occurs or the widget is disposed the active state is also set tofalse.

Events

detect

Fired when a barcode has been detected. The rate of detect events varies from platform to platform. It is very likely to receive duplicate events for the same barcode.

Event parameter
  • format: string
    • The format of the detected barcode
  • data: string
    • The data contained in the barcode

error

Fired when an error during the BarcodeScannerViews lifecycle happened. After an an error occurred no further detect event will be fired and the widget becomes unusable.

Event parameter
  • error: string
    • A message providing details about the error

activeChanged

Fired when the active state of the widget changes. Either by calling start()/stop(), receiving an error event or disposing the widget.

Methods

start([formats])

Enables the camera and starts scanning for barcodes. When started, the barcode scanner continuously fires the detect event as soon as it finds a barcode in its view. To end barcode detection stop() should be called or the widget should be disposed. Not disabling the barcode scanner will consume a lot of unnecessary processing power. The given formats array can be used to narrow down the detected barcodes.

Example:

scanner.start(['qr']);
Parameter
  • formats : string[]
    • The optional formats array allows to limit the detection of barcodes to only the given formats. The supported barcode names can be obtained from the list of supported barcodes. If formats is omitted all barcodes supported on the platform will be detected.

stop()

Stops the barcode scanning and disables the camera.

Example:

scanner.stop();

Compatibility

Compatible with Tabris.js 3.6.0

Supported platforms

  • Android
  • iOS

Development of the widget

While not required by the consumer or the widget, this repository provides a project folder that contains platform specific development artifacts. These artifacts allow to more easily consume the native source code when developing the native parts of the widget.

Android

The project provides a gradle based build configuration, which also allows to import the project into Android Studio.

In order to reference the Tabris.js specific APIs, the environment variable TABRIS_ANDROID_PLATFORM has to point to the Tabris.js Android Cordova platform root directory.

export TABRIS_ANDROID_PLATFORM=/home/user/tabris-android-cordova

The environment variable is consumed in the gradle projects build.gradle file.

Copyright

See LICENSE notice.

tabris-plugin-barcode-scanner's People

Contributors

cpetrov avatar elshadsm avatar karolszafranski avatar mknauer avatar mpost avatar patrykmol avatar tbuschto avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tabris-plugin-barcode-scanner's Issues

Detect event is triggered multiple times after first

Problem description

Continuous use of the plugins makes the detect duplicate data or get triggered multiple times.
When I scan a qr code, and detection occurred, I stop the scanner and get the data.
Starting the scanner again to scan code, on detect, the scanner stops but then the detect event is trigger twice now and more times depending on the previous trigger count.
The makes the code inside the detection event to run multiple times.

Expected behavior

Expect the detect event to be just ones

Environment

  • Tabris.js version: 3.5
  • Device: Samsung
  • OS: Android 6

Code snippet

// A minimal, *self-contained* code snippet to reproduce the problem:
scanner.on('detect', (e) => {
    indicator.visible = true;
	processingCapture = true;
	//console.log(`Detected ${e.format} code with data ${e.data}`)
	scanner.stop();
	//processCapture(e.data,accessData);
  }).on('error', (e) => console.log(e.error));

Create type definitions

Type definitions should be provided in order to be able to use the plugin in a TypeScript project safely.

scaleMode "fill" does not work

Problem description

Setting the scaleMode to "fill" does not have any effect. The scanner appears as if it would have been configured with scaleMode "fit". This works as expected on Android.

Expected behavior

scaleMode "fill" should make the camera frame cover the view bounds as documented, i.e. in the example, no red area should be visible.

Environment

  • Tabris.js version: 2.4
  • Device: iPhone 6
  • OS: iOS 11.2.5

Code snippet

In the example, replace the BarcodeScannerView constructor call with:

...
let scanner = new esbarcodescanner.BarcodeScannerView({
  left: 0, top: 0, width: 200, height: 200,
  background: 'red',
  scaleMode: 'fill'
}).on('detect', (event) => {
...

Plugin does not work on some devices

Problem description

When using Galaxy J3 (2016), no barcodes can be successfully detected.

Expected behavior

The barcode scanner should work for all devices running a supported Android version.

Environment

  • Tabris.js version: 2.4
  • Device: Samsung Galaxy J3 (2016)
  • OS: Android 5.1.1

Code snippet

Reproducible in the plugin example.

Scanner widget cannot be disposed

Problem description

When disposing the scanner, the scanning stops, but the scanner view remains visible.

Expected behavior

The scanner view should be destroyed when calling dispose().

Environment

  • Tabris.js version: 2.4

Code snippet

Add this button to the example and press it:

let disposeButton = new Button({
  left: 16, right: 16, top: 'prev() 16', bottom: 24,
  text: 'Dispose'
}).on('select', () => scanner.dispose())
  .appendTo(controls);

Enable torch while using the scanner

Problem description

We are currently using https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin together with tabris-plugin-barcode-scanner and all is working fine in iOS but not on Android.

Adding direct support for enabling the torch/flashlight might be a better option. Hopefully this gets considered. Thanks.

Expected behavior

Environment

  • Tabris.js version:
  • Device:
  • OS:

Code snippet

// A minimal, *self-contained* code snippet to reproduce the problem:

Giving permissions when containing page is shown breaks the app

Problem description

When a new page is created containing the scanner view and its start() method gets called, a permission dialog will be shown when the camera permission has not been given yet. When accepting the permission request, the app content will slide to the right and the user will be left with an unusable white screen.

Environment

  • Tabris.js version: 2.4.0
  • Device: Samsung Galaxy S8
  • OS: Android 8

Code snippet

const {Button, Page, NavigationView, ui} = require('tabris');

let navigationView;
let scannerView;
let button;

ui.contentView.append(
  navigationView = new NavigationView({left: 0, top: 0, right: 0, bottom: 0}),
  button         = new Button({centerX: 0, centerY: 0, text: 'Open scanner page'})
                    .on({tap: () => openScannerPage()})
)

function openScannerPage() {
  button.dispose();
  navigationView.append(
    new Page().append(
      scannerView = new esbarcodescanner.BarcodeScannerView({left: 0, right: 0, top: 0, bottom: 0})
    )
  )
  .appendTo(ui.contentView);
  scannerView.start();
}

README has out of date information on adding the plugin

Following a discussion on Slack we realised that the install instructions are out of date.

The instructions suggest adding the following to config.xml:

<plugin name="tabris-plugin-barcode-scanner" spec="1.x" />

But for compatibility with the latest versions of Tabris you need

<plugin name="tabris-plugin-barcode-scanner" spec="3.x" />

"error" event sometimes not triggered when permission denied

Problem description

When the permission gets denied through the system dialog prompt, an "error" event is properly triggered. However, when the view is created after the permission had been denied, no error will be triggered.

Expected behavior

An error event should always be trigger when the camera permission is disabled.

Environment

  • Tabris.js version: 2.8.1
  • Device: iPad Pro
  • OS: iPadOS 13.1

Code snippet

See the plugin example.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.