Notes on hacking various Android-based media devices
Theatres, immersive experiences, and escape rooms are increasingly making use of video effects displayed on monitors and screens or projected onto surfaces. These would ideally be controlled via centralised show control software which could either deliver media over a network, or at least send a signal to trigger playback of a local media file.
There are many "Media Players" available on AliExpress etc. which are running some variant of the Android operating system and would seem to have all the hardware required - they have (normally wireless, sometimes wired) network connection, HDMI output, can access media on USB storage. The problem is that they are not designed to be controlled by anything other than their supplied IR remote. One alternative then is to use an IR blaster device to clone and replay the command signals sent by the controller. Another is to try to modify and control the built-in Android operating system to remotely trigger playback of files from the USB/SD storage.
Note that Amazon Fire sticks etc. do not generally have any local storage, nor the ability to load files from USB storage.
- External USB support can be added using https://www.amazon.co.uk/Power-Cable-Firestick-Lite-Cube-Black/dp/B07XTSQ8ZY
- Wired ethernet support can be added using https://www.amazon.co.uk/Ethernet-Adapter-Compatible-Chromecast-Streaming-1PCS/dp/B0GR8WM124
This is running a cut-down version of Android that has ADB access already authorised, which means it's possible to connect to and control over a network using ADB. Set up the projector to access the local Wi-Fi, and take a note of the assigned IP address. Then issue ADB commands from a PC on the same network.
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
adb connect 192.168.1.42:5555 (e.g.)
Check it is connected:
adb devices
adb shell pm list packages
Check available space
adb shell df /
adb push black_1920x1080.png /sdcard/black_1920x1080.png
adb shell am start -a android.intent.action.VIEW -d file:///sdcard/black_1920x1080.png -t image/png
adb shell rm /sdcard/black_1920x1080.png
adb shell find /storage/sda1 -iname "*.mp4"
adb shell ls -l /sdcard/
adb shell am start -a android.intent.action.VIEW -p com.hisilicon.android.videoplayer -d "file:///storage/sda1/Airplane.mp4" -t video/mp4
or:
adb shell am start -a android.intent.action.VIEW -n com.newlink.cast/tv.danmaku.ijk.media.example.activities.VideoActivity -d "file:///storage/sda1/Pirate.mp4" -t video/mp4
adb shell getevent -lp
adb shell input keyevent KEYCODE_MEDIA_NEXT
or by number:
adb shell input keyevent 87
List of events:
KEYCODE_HOME 3 Home
KEYCODE_BACK 4 Back / exit
KEYCODE_MENU 82 Menu / player options
KEYCODE_SETTINGS 176 Settings
KEYCODE_DPAD_UP 19 Up
KEYCODE_DPAD_DOWN 20 Down
KEYCODE_DPAD_LEFT 21 Left / rewind in some players
KEYCODE_DPAD_RIGHT 22 Right / forward in some players
KEYCODE_DPAD_CENTER 23 OK / select
KEYCODE_ENTER 66 Enter / select
KEYCODE_ESCAPE 111 Escape / back-like
KEYCODE_MEDIA_PLAY_PAUSE 85 Play/pause toggle
KEYCODE_MEDIA_STOP 86 Stop
KEYCODE_MEDIA_NEXT 87 Next item
KEYCODE_MEDIA_PREVIOUS 88 Previous item
KEYCODE_MEDIA_REWIND 89 Rewind
KEYCODE_MEDIA_FAST_FORWARD 90 Fast-forward
KEYCODE_MEDIA_PLAY 126 Play
KEYCODE_MEDIA_PAUSE 127 Pause
KEYCODE_MEDIA_CLOSE 128 Close media
KEYCODE_MEDIA_EJECT 129 Eject
KEYCODE_MEDIA_RECORD 130 Record
KEYCODE_MEDIA_SKIP_FORWARD 272 Skip forward
KEYCODE_MEDIA_SKIP_BACKWARD 273 Skip backward
KEYCODE_MEDIA_STEP_FORWARD 274 Step forward
KEYCODE_MEDIA_STEP_BACKWARD 275 Step backward
KEYCODE_POWER 26 Power toggle; you found this turns projector off
KEYCODE_SLEEP 223 Sleep; did nothing on your firmware
KEYCODE_WAKEUP 224 Wake; only works if ADB remains alive
KEYCODE_TV_POWER 177 TV/projector power
KEYCODE_TV_INPUT 178 Input/source
KEYCODE_STB_POWER 179 Set-top-box power
KEYCODE_STB_INPUT 180 Set-top-box input
KEYCODE_AVR_POWER 181 AV receiver power
KEYCODE_AVR_INPUT 182 AV receiver input
KEYCODE_GUIDE 172 Guide
KEYCODE_CAPTIONS 175 Captions/subtitles
KEYCODE_INFO 165 Info / OSD
KEYCODE_TV 170 TV
KEYCODE_WINDOW 171 Window / PiP-like on some builds
KEYCODE_CHANNEL_UP 166 Channel up / sometimes next
KEYCODE_CHANNEL_DOWN 167 Channel down / sometimes previous
KEYCODE_TV_MEDIA_CONTEXT_MENU 257 TV media menu
KEYCODE_VOLUME_UP 24 Volume up
KEYCODE_VOLUME_DOWN 25 Volume down
KEYCODE_VOLUME_MUTE 164 Mute
KEYCODE_MUTE 91 Mute mic/audio route on some builds
KEYCODE_PROG_RED 183
KEYCODE_PROG_GREEN 184
KEYCODE_PROG_YELLOW 185
KEYCODE_PROG_BLUE 186
KEYCODE_0 7
KEYCODE_1 8
KEYCODE_2 9
KEYCODE_3 10
KEYCODE_4 11
KEYCODE_5 12
KEYCODE_6 13
KEYCODE_7 14
KEYCODE_8 15
KEYCODE_9 16
KEYCODE_STAR 17
KEYCODE_POUND 18
KEYCODE_APP_SWITCH 187 Recent apps
KEYCODE_SEARCH 84 Search
KEYCODE_ASSIST 219 Assistant
KEYCODE_BRIGHTNESS_DOWN 220 Brightness down
KEYCODE_BRIGHTNESS_UP 221 Brightness up
KEYCODE_NOTIFICATION 83 Notification panel
KEYCODE_SOFT_SLEEP 276 Soft sleep, if supported
adb shell df -h