Android devices.

ArdaPlayer is also an Android app. The same player runs the same app on a tablet, a screen with Android inside or a TV box — the same activation code, the same data and settings, the same device page in the portal. It is installed from this site, not from Google Play, so Android asks a few questions first; this page answers them.

Working — from ArdaPlayer v1.3.0

What you need

  • Android 7.0 or newer on a tablet, a display with Android inside, or a TV box. One app covers 64-bit and 32-bit ARM and x86-64 boxes.
  • A network — Wi-Fi, Ethernet or mobile data — and an ArdaForm account with a project for the device to join.
  • The app, always the newest at the same address: https://ardaform.net/get/ardaplayer-android.apk. The portal's Downloads page has it too, beside the other players.
  • For kiosk mode only: a computer with adb and a USB cable, once per box (below).

Installing the app

  1. On the tablet, open the link in its browser — ardaform.net/get/ardaplayer-android.apk. Chrome may say the file can harm your device; choose Download anyway.
  2. Open the downloaded file from the notification, or from Files › Downloads.
  3. Allow the browser to install apps. The first time, Android says it is not allowed to install unknown apps from this source. Tap Settings, switch on Allow from this source, and go back. (Elsewhere it is Settings › Apps › Special app access › Install unknown apps.)
  4. Tap Install. If Google Play Protect warns, see the next section.
  5. Open ArdaForm Player. It goes full screen and shows its activation code.

A box with no browser — many TV boxes — takes the same file over USB debugging: adb install ardaplayer-android.apk from a computer (the kiosk section says how to connect), or from a USB stick through the box's file manager.

shell installing from a computer instead
$ curl -LO https://ardaform.net/get/ardaplayer-android.apk
$ adb install ardaplayer-android.apk
Performing Streamed Install
Success

Android's warnings, and why they appear

Android warns about every app that does not come from Google Play, and ArdaPlayer is not on Google Play. Two more things make Play Protect careful with it, and both are on purpose:

  • it can be made the box's device owner, which is what kiosk mode needs (below), and
  • it may install packages, so that it can update itself later.

So Play Protect may say This app may be harmful, Unsafe app blocked or App scan recommended. Tap More details, then Install anyway (or Install without scanning). It is a warning about where the app came from, not something Play Protect found in it.

To check that the file really is ArdaForm's, compare its signing certificate with the one below — every ArdaPlayer for Android is signed with this one certificate, and Android refuses an update signed with any other:

shell the certificate, with Android's build tools
$ apksigner verify --print-certs ardaplayer-android.apk
Signer #1 certificate DN: CN=ArdaForm Player, O=Tominko Ltd, C=GB
Signer #1 certificate SHA-256 digest: 255ea35ebd85eb4bab3223c4e970dd939a4a3132461896ab52741f17ccf6bc28

When the app first opens, Android asks Let app always run in background? — choose Allow: it keeps the player connected while the screen is off, so the portal sees the device and settings arrive at once. It asks once; the line under kiosk mode does the same for a box nobody taps.

Activating it

Exactly like any other device: the screen shows a short code; in the portal open Devices › Add device, type it, and choose the project. The tablet starts your app as soon as its data has arrived. From then on it is one more device in the list — its Setup tab gains an Android panel with what kind of box it is, and its switches.

As an ordinary app

Installed as above, the player is an app like any other. It opens full screen and runs your app, and:

  • Staff can leave it — Home, Recents and the notification shade still work. For a tablet beside a till that is usually what you want.
  • It connects when the tablet starts, by itself. To have it on the screen at start too, make it the home app: Settings › Apps › Default apps › Home app › ArdaForm Player. Pressing Home then opens the player.
  • Shut down in the portal closes the player — Android has no power-off for an app — and the device shows offline until somebody opens it. Switch Shut down closes the player off in Setup › Android (or through the API) to forbid it.
  • Reboot is not available unless the player is the device owner.
  • Wi-Fi printers are found from the device page: Peripherals › Find printers on the network, or from the app with Arda.printers.discover().
  • The battery shows on the device page, and the portal raises a battery low alert below 15 % while it runs on battery, cleared at 20 % or on a charger.

Kiosk mode: making the player the device owner

Android has one role that lets an app run the whole box: the device owner. Shops, kiosks and signage fleets use it. With it, the portal's Kiosk mode switch locks the screen to the player — no status bar, no Home, no Recents, no lock screen, nobody leaving it — and while it is on, the player is also the box's home screen. Switch it off and the box is a tablet again. A device owner can also be restarted from the portal (Reboot).

!
Only on a box with no accounts Android hands the device-owner role only to a box that has no accounts on it — in practice a freshly reset one, or one with every Google or vendor account removed in Settings › Accounts. Install the player before adding anything else. And plan on keeping it: only a factory reset takes the role away again.
  1. Install the app as above, and add no account.
  2. Turn on developer options: Settings › About tablet, tap Build number seven times.
  3. Turn on USB debugging: Settings › System › Developer options › USB debugging.
  4. Connect it to a computer with adb — sudo pacman -S android-tools, sudo apt install adb, brew install android-platform-tools, or Google's platform-tools for Windows. Accept the Allow USB debugging? prompt on the tablet.
  5. Give the player the role with the one command below.
  6. Restart the tablet. The device's Setup › Android panel now says device owner, and Kiosk mode can be switched on.
shell once per box
$ adb devices
List of devices attached
HGA4K2R7        device
$ adb shell dpm set-device-owner net.ardaform.player/.AdminReceiver
Success: Device owner set to package …

Not allowed to set the device owner because there are already some accounts on the device means an account is still there — remove it and run the command again. A TV box with no USB port for a computer can usually take adb connect <its address>:5555 over the network once network debugging is on in its developer options; Android 11 and newer also offer Wireless debugging, paired with adb pair.

Five more lines help a box that has to run unattended:

shell optional
# keep the player awake with the screen off, without the dialog
$ adb shell dumpsys deviceidle whitelist +net.ardaform.player
# let the player hold the portal's Screen orientation across restarts (v1.4.0 and newer; see below)
$ adb shell appops set net.ardaform.player WRITE_SETTINGS allow
# the older way to let the orientation turn a large screen — some tablets forget it at a restart
$ adb shell wm set-ignore-orientation-request false
# gesture navigation: in kiosk mode, 3-button navigation can leave its bar over the app
$ adb shell cmd overlay enable com.android.internal.systemui.navbar.gestural
# Bluetooth on, for a Bluetooth printer (v1.5.1 and newer) — some tablets ship with it off
$ adb shell svc bluetooth enable

The last is for a bar some tablets leave along the bottom of a locked app — see The kiosk shows a bar along the bottom. It is harmless on a box that does not have the problem.

The kiosk shows a bar along the bottom

You switch Kiosk mode on and a strip appears along the bottom of the screen with a lone back arrow on it, sitting over whatever the app has down there — its bottom row of buttons, a footer. Before the kiosk the app filled the screen.

That strip is Android’s own three-button navigation bar with Home and Recents removed by the lock. The player asks Android to hide its bars, and Android does — until the screen is locked to the app, when some tablets (an Android 16 Teclast, measured) bring the bar back and never take it away: not after a few seconds, not on a tap, not when the player asks again. Nothing in the player or the portal can push it off, because Android does not tell the app the bar is there.

The cure is to switch the tablet to gesture navigation, which has no bar to get stuck. Some tablets offer it in Settings › System › Gestures › System navigation; the sure way is one line over adb, which takes effect at once and survives restarts:

shell once per box
$ adb shell cmd overlay enable com.android.internal.systemui.navbar.gestural

From ArdaPlayer v1.4.1 the player clears these bars itself — the one that appears when the kiosk starts, and the ones a swipe in from the top or bottom edge brings back — within about a second. The gesture-navigation line is still worth running on a new box: with it there is no bar to clear at all.

The app comes down to the bottom edge straight away. Back becomes a swipe in from the left or right edge, which the app handles exactly as it handled the arrow. To return to buttons later, run the same line with com.android.internal.systemui.navbar.threebutton.

Portrait or landscape

Setup › Android › Screen orientation holds the screen in Portrait or Landscape, or Follow the device: the tablet turns as it is turned. An app can preset it in its manifest — "screen": {"orientation": "landscape"} — and lock it there with "writable": {"portal": false} (the manifest's screen section); the HTTP API sets it too (Devices). Android 12L and newer may ignore an app's orientation on a large screen. From v1.4.0 the player also sets Android's own rotation lock — the one the quick-settings tile sets — which holds across restarts, once the tablet has been given Modify system settings: the appops line above, or Settings › Apps › Special app access › Modify system settings. On an older player, or without that permission, the wm line above lifts the restriction instead — but some tablets (a Teclast, measured) forget it at the next restart.

Updating the app

The Android player does not update itself yet. When a new version is out, open the same link on the tablet and install it over the old one: it keeps its activation, its data and its settings. Do not uninstall it first — an uninstalled player forgets who it was, and the tablet would come back as a new device (remove the old one from the portal if that happens).

Taking it back

  • Kiosk mode off: the switch in Setup › Android; the box is a normal tablet again at once.
  • Device owner off: only a factory reset — Settings › System › Reset options › Erase all data.
  • Uninstall: an ordinary app uninstalls as usual; a device-owner player cannot be uninstalled until the box is reset.

What Android cannot do

An Android app is not the whole machine, so a few things a Linux device does are not there:

  • No power-off: Shut down closes the player. No reboot unless the player is the device owner.
  • No firewall, no SSH, no root shell — the device view (screen, console) works; the portal's SSH tab does not apply.
  • No images or installer — the app is the installer — and no headless mode.
  • No camera pictures yet: showing a camera needs video tools an Android app does not carry, so camera is missing from features.
  • No USB printers, serial adapters or volume yet — an app cannot reach the device nodes. Wi-Fi and network printers work, from v1.4.0 so does brightness (Screens), and from v1.5.1 so do Bluetooth printers (Printers) — switch Bluetooth on in the tablet’s settings once.
  • No Wi-Fi from the app: the tablet joins its network in Android's own settings; Arda.wifi says there is no wireless to manage. From v1.4.1 the portal's Wireless pane shows the network the tablet is on and that traffic goes over it, with a note that it is managed on the tablet.
  • A portal screenshot shows a playing video as a black rectangle — Android draws video on a layer the window capture cannot see. The video itself plays normally.

For app developers

  • The page runs in Android's own WebView (Chromium). <video> plays H.264, HEVC and VP9, and starts without a tap.
  • Arda.on('back', fn) hears Android's back key; nothing else happens when it is pressed.
  • Arda.system.shutdown() closes the player, or is refused when the portal forbids it.
  • Arda.battery.status() and Arda.on('battery') report the charge, whether it is charging, and the time left when Android knows it (the device).
  • From v1.4.0, Arda.device().platform says what the app is on — os is 'android' here, kiosk true once the portal's Kiosk mode holds the screen — and Arda.screens.set(null, {brightness: 40}) dims the tablet (Screens).
  • From v1.5.1 the printer search (Arda.printers.discover()) asks every network the tablet is on — its Wi-Fi and a docked Ethernet — and holds the Wi-Fi multicast lock while it listens, so printers come back by name (printers).
  • From v1.5.2 a tablet set up as device owner manages its Wi-Fi from the app: Arda.wifi.list(), connect(ssid, key), forget(ssid) and status() work as on a Pi (the activation screen’s Wi-Fi panel and the portal’s Wi-Fi tab with them); an ordinary install cannot add a network since Android 10, so there Arda.wifi.settings() opens Android’s own Wi-Fi panel over the app and status().managed is false (the device).
  • Feature-test, never sniff: Arda.device() resolves with features, the list of what this player can do here — battery, netPrinters, kiosk on a device owner, shutdown unless the portal forbids it (the device).

Checked: installed from this site on a Lenovo tablet (Android 16) as an ordinary app — activation, the app and its data, a Wi-Fi receipt printer found and added, the battery in the portal — and on an Android 15 emulator as device owner: the dpm line above, kiosk mode from the portal, the orientation turned with the second optional line, an H.264 video playing. The signing certificate was read from the published file. Play Protect's wording differs between Android versions and makers.