Android · Zebra · WebView

Between the barcode scanner and the web ERP

Billman ERP for Zebra is a middleware application for Zebra industrial Android devices. It configures the DataWedge profile on startup, hands the scanned barcode to the loaded web page through a single JavaScript call — the callback name is server-overridable — and listens for incoming MQTT push notifications in the background.

Version 2.4.5 · minSdk 33 · package hu.billman.erp.android.zebra

What does the application do?

The installed WebView loads the ERP and hands the barcode to the code running in the browser. The other services — MQTT, PDF, Basic Auth, forced update — operate in the background.

WebView wrapper

Loads the configured URL in full screen. On network failure it retries automatically every 3 seconds and shows a notification once the connection is restored.

Automatic DataWedge configuration

On startup the app creates the Billman profile itself, associates with it, and enables the Intent Output plugin. The scanned barcode is handed to the page's onScan(data) function — the callback name can be overridden via server-side config (zebra.jsonscan_callback).

MQTT push service

A foreground service maintains the connection to the broker. On an incoming message: 500 ms vibration, sound and toast — even when the device is asleep.

Server-side configuration

The <url>/zebra.json file is fetched automatically on startup and after saving. Only the fields actually sent are overwritten — values missing from the JSON (including the locally entered username and password) are left untouched.

Built-in PDF viewer

PDF links open in the PDF.js viewer with session cookies preserved. Links with other schemes (tel:, mailto:) are handed to the system app.

Version enforcement

If min_version_code is greater than the installed version, on startup the app shows a non-dismissible dialog — Play Store or exit.

DataWedge: configured by the app

On startup, the app performs the DataWedge configuration automatically through the SET_CONFIG API. No separate setup step is needed from the operator — the table only shows the reference values, which the app writes itself.

SettingValue
Profile nameBillman
ModeCREATE_IF_NOT_EXIST — created only if not yet present
Associated apphu.billman.erp.android.zebra (all activities)
Intent actionhu.billman.SCAN
Intent categoryempty
Intent deliveryBroadcast Intent
Keystroke Outputdisabled (so it doesn't type into the focus)

What does the page receive?

The scanned text is handed to the browser-side callback. The function name defaults to onScan, but it can be overridden server-side via the scan_callback field of zebra.json — for example to a different handler name, or to a per-page logic.

// Default — this is what the app calls
window.onScan = function (data) {
    console.log('Scanned code:', data);
};

// In zebra.json: { "scan_callback": "handler" }
// → from now on the app calls this:
window.handler = function (data) { /* ... */ };

If the given function is not defined on the loaded page, the scan is silently dropped — there is no exception and no default fallback.

Server-side zebra.json

A JSON file placed at the root of the configured web address overrides selected app settings. Every field is optional; the Settings screen then reveals the Download configuration button.

This way the configuration is remotely manageable: by editing a single JSON file, every installed device switches over uniformly. For a warehouse fleet there is no need to set the broker, the picker URL or the callback name per device — once it is on the server, it applies everywhere. The min_version_code field forces older installations to update, so outdated clients cannot get stuck in the fleet.

FieldMeaning
min_version_codeMinimum required versionCode. Older installs are forced to update.
min_app_versionTextual version shown in the update dialog.
order_picker_urlSeparate URL for the order picker screen.
mqtt_serverMQTT broker URL, e.g. tcp://host:1883.
mqtt_topicSubscribed topic name.
mqtt_payloadTrigger payload. If empty, any message triggers an alert.
mqtt_soundsystem · alarm · none
scan_callbackPage-side callback function name. Default: onScan.
{
    "min_version_code": 19,
    "order_picker_url": "https://billman.hu/order-picker",
    "mqtt_server": "tcp://broker.example:1883",
    "mqtt_topic": "billman/notifications",
    "mqtt_payload": "",
    "mqtt_sound": "system",
    "scan_callback": "onScan"
}

The update is selective: only the values actually sent in the JSON are overwritten. Everything else, kept as user-level local settings, stays untouched — username and password, for example, are never overridden from the server. If the server is unreachable or the file is missing, the entire local configuration is preserved. Changes take effect immediately, no restart needed.

Picking event notification (MQTT)

If an MQTT broker and topic are configured in Settings, the app keeps listening in the background — even with the screen off, or another app in the foreground.

Sound modes

  • system — system notification sound
  • alarm — alarm sound, for noisy environments
  • none — vibration and toast only

Trigger logic

If the Payload field is set, only an exact match alerts. With an empty field, any incoming message triggers an alert.

The foreground service shows a persistent notification: “Picker listener active”.

Download and updates

The app's package name is hu.billman.erp.android.zebra. Updates are delivered through the Google Play Store; forced updates are controlled by the min_version_code field.

Version
2.4.5
versionCode
19
Minimum SDK
Android 13 (API 33)
Target SDK
Android 14 (API 36)
Languages
Hungarian · English · German

Testers wanted

The application is currently in a closed testing phase. The Play Store makes the build available only to enrolled testers — without prior registration the download cannot start.

We welcome applications from operators running Zebra industrial Android devices in production environments. Submit the application with the e-mail address used in the Google Play Store — if multiple people want to test, list every Play account e-mail address in the message.

Get in touch