Android app for Fire tablets that plays video/streams and exposes a phone-friendly remote control page over local Wi-Fi.
- Plays direct stream URLs on the tablet (
.m3u8, MP4, and other ExoPlayer-supported formats). - Shows a local control URL on the tablet screen (for example
http://192.168.1.25:8080). - Protects remote page/API with a simple PIN (default:
2468). - Lets your phone control playback by opening that URL in a browser.
- Supports remote actions:
load,play,pause,stop, andseek +/-10s.
app/src/main/java/com/example/fireremoteplayer/MainActivity.ktapp/src/main/java/com/example/fireremoteplayer/player/PlayerViewModel.ktapp/src/main/java/com/example/fireremoteplayer/remote/HttpRemoteServer.ktapp/src/main/java/com/example/fireremoteplayer/ui/MainScreen.kt
This repo includes Gradle wrapper scripts and properties.
gradle/wrapper/gradle-wrapper.jar is still required and must be generated once on your machine.
- Open the project root in Android Studio.
- When prompted, use Android Studio's embedded Gradle/JDK.
- Build the
appmodule. - Enable Developer Options + ADB on your Fire tablet.
- Install from Android Studio or with ADB.
To finalize wrapper binary:
gradle wrapperBuild debug APK in Docker (no local Android SDK needed):
docker build --platform=linux/amd64 -t fire-remote-player-builder .Extract APK from container:
docker create --name fire-builder fire-remote-player-builder
docker cp fire-builder:/workspace/app/build/outputs/apk/debug/app-debug.apk ./app-debug.apk
docker rm fire-builderOutput APK:
./app-debug.apk(afterdocker cp)
- CI build workflow:
.github/workflows/android-build.yml - Release workflow:
.github/workflows/android-release.yml
How it works:
- Every push/PR to
mainbuildsapp-debug.apkand uploads it as a workflow artifact. - Pushing a tag like
v1.0.0builds release APK and publishes a GitHub Release with:fire-remote-player-v1.0.0.apk
- Connect tablet and phone to the same Wi-Fi network.
- Launch the app on the Fire tablet.
- On the tablet screen, copy the shown control URL.
- Open that URL on your phone browser and enter the PIN shown on the tablet (
2468by default). - Paste a stream URL and tap Load.
GET /api/statusPOST /api/loadbody:{ "url": "https://...", "autoPlay": true }POST /api/playPOST /api/pausePOST /api/stopPOST /api/seekbody:{ "positionMs": 120000 }
All API requests require header X-PIN: <pin> (or ?pin=<pin> query parameter).
- This is designed for local-network control with simple PIN auth.
- For internet exposure, add stronger auth and TLS.