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.
Android · Zebra · WebView
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.
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.
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.
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.json → scan_callback).
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.
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.
PDF links open in the PDF.js viewer with session cookies preserved. Links with other schemes (tel:, mailto:) are handed to the system app.
If min_version_code is greater than the installed version, on startup the app shows a non-dismissible dialog — Play Store or exit.
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.
| Setting | Value |
|---|---|
| Profile name | Billman |
| Mode | CREATE_IF_NOT_EXIST — created only if not yet present |
| Associated app | hu.billman.erp.android.zebra (all activities) |
| Intent action | hu.billman.SCAN |
| Intent category | empty |
| Intent delivery | Broadcast Intent |
| Keystroke Output | disabled (so it doesn't type into the focus) |
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.
zebra.jsonA 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.
| Field | Meaning |
|---|---|
min_version_code | Minimum required versionCode. Older installs are forced to update. |
min_app_version | Textual version shown in the update dialog. |
order_picker_url | Separate URL for the order picker screen. |
mqtt_server | MQTT broker URL, e.g. tcp://host:1883. |
mqtt_topic | Subscribed topic name. |
mqtt_payload | Trigger payload. If empty, any message triggers an alert. |
mqtt_sound | system · alarm · none |
scan_callback | Page-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.
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.
system — system notification soundalarm — alarm sound, for noisy environmentsnone — vibration and toast onlyIf 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”.
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.
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.