Skip to content

Repository files navigation

Display Launcher

A headless Android launcher designed for digital signage, kiosks, and remote displays. Controls application execution via a local HTTP API or browser-based control panel.

Features

  • REST API endpoints for programmatic application launching and intent execution.
  • Embedded web interface for device management.
  • Remote APK upload, installation, and package removal.
  • Intent parameter passing (actions, data URIs, and extra key-value pairs).

Caution

This application has NO built-in authentication or encryption. The web server runs on port 9091 with unrestricted access to network clients.

❌ DO NOT expose this app directly to the internet
❌ DO NOT port forward port 9091
❌ DO NOT deploy on untrusted networks
❌ DO NOT assume any built-in security controls exist

Installation

Requirements

  • Android 7.0 (API 24) or higher.
  • Android 14+ recommended for full foreground service type compliance.

Setup Procedure

  1. Install the APK package on the target device.
  2. Launch the application locally.
  3. Press D-Pad DOWN 3 times rapidly (or tap the center of the screen 3 times within 1 second) to invoke the settings UI.
  4. Select "Set as Default Launcher" to register the app as the system home handler.

Usage

UI Access

To open the settings interface on a headless display:

  1. Return to the home screen (renders a black background).
  2. Press D-Pad DOWN 3 times quickly (or tap the center of the display 3 times within 1 second).
  3. Select "Hide UI" to return to headless mode.

Web Interface

Access the control panel from any HTTP client on the local network:

http://[device-ip-address]:9091

REST API Reference

Get Installed Applications

GET http://[device-ip]:9091/api/apps

Response:

[
  {
    "name": "Chrome",
    "packageName": "com.android.chrome"
  }
]

Launch Application

POST http://[device-ip]:9091/api/launch
Content-Type: application/json

{
  "packageName": "com.android.chrome"
}

Launch Application with Intent and Extras

POST http://[device-ip]:9091/api/launch-intent
Content-Type: application/json

{
  "packageName": "com.tpn.streamviewer",
  "action": "android.intent.action.MAIN",
  "extra_string": "camera_name:FRONTDOOR"
}

Intent Payload Parameters:

Field Type Description
packageName String Target package identifier (required).
action String Intent action string (e.g., android.intent.action.VIEW).
data String Intent data URI string.
extra_string String Comma-separated key-value pairs for intent extras (key:value).

Uninstall Application

POST http://[device-ip]:9091/api/uninstall
Content-Type: application/json

{
  "packageName": "com.example.app"
}

Upload and Install APK

POST http://[device-ip]:9091/api/upload-apk
Content-Type: multipart/form-data

Limitations

  • Default Home Requirement: Must be registered as the default home launcher to ensure proper foreground task switching.
  • Local Network Scope: Restricted to local network interfaces; lacks TLS/HTTPS support.
  • User Prompts: Package installation and removal actions require manual confirmation via system dialogs on the physical display.

Troubleshooting

  • Service Persistence: Ensure battery optimization is disabled for the application if the OS terminates the background service.
  • Network Validation: Verify interface connectivity and local port availability (9091).
  • Logcat Verification: Inspect logs using adb logcat | grep DisplayLauncher.

Examples

cURL

# Launch Chrome
curl -X POST [http://192.168.1.100:9091/api/launch](http://192.168.1.100:9091/api/launch) -H "Content-Type: application/json" -d '{"packageName":"com.android.chrome"}'

# Launch Intent with Extras
curl -X POST [http://192.168.1.100:9091/api/launch-intent](http://192.168.1.100:9091/api/launch-intent) -H "Content-Type: application/json" -d '{"packageName":"com.tpn.streamviewer","action":"android.intent.action.MAIN","extra_string":"camera_name:FRONTDOOR"}'

Python

import requests

requests.post('[http://192.168.1.100:9091/api/launch](http://192.168.1.100:9091/api/launch)', json={'packageName': 'com.android.chrome'})

Documentation

About

Display Launcher is an API-controlled Android launcher for non-interactive displays like kiosks and digital signage. It launches apps programmatically via HTTP endpoints and includes a web-based control panel for remote management, eliminating the need for touch interaction.

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages