Android XR 180° SBS 3D Video Player

180° SBS 3D Video Player — immersive video for Android XR

I built a small native Android XR app that plays 180° side-by-side (SBS) stereoscopic video on a curved hemisphere in full-space mode — the kind of immersive playback you want from a VR headset, without going through any third-party player. It targets devices with OpenXR support and is tested on a Samsung Galaxy XR.

Get it on Google Play

The app is now on the Play Store:

👉 Android XR 180° SBS 3D Video Player on Google Play

Note: if the listing isn’t live yet, it’s still completing Google’s review — it’ll populate shortly.

Screenshots

Control panel with transport, pitch and zoom steppers, file picker and lock
The auto-hiding control panel — transport, seek, pitch and zoom steppers, file picker and lock.
Pitch set to +15 degrees and zoom at 1.40x
Pitch (±60°) tilts the dome; zoom (0.5×–10×) scales the whole hemisphere.
Pinch-and-drag seek bar over an immersive sunset scene
Pinch & drag to seek without bringing up the full panel.
Controls locked overlay with an unlock button
Lock the controls so stray gestures won’t move the screen mid-playback.

Features

  • Plays 180° SBS video on a 15 m hemisphere surface (StereoMode.SIDE_BY_SIDE)
  • System file picker for any video/* source; URI permission is persisted
  • Pitch control (±60°) that re-uses the headset’s horizon-reset/recenter button
  • Zoom by scaling the hemisphere entity (0.5×–10×)
  • Pinch-and-drag gestures for seeking and pitch
  • Auto-hiding control panel: transport, seek, hand toggle, lock
  • Looped playback via ExoPlayer

How it’s built

Three runtime pieces are wired together in a single ComponentActivity:

  1. An XR Session from androidx.xr.runtime — created once on launch.
  2. A SurfaceEntity from androidx.xr.scenecore shaped as a Hemisphere(15m) in SIDE_BY_SIDE stereo mode. This is the 3D screen.
  3. An ExoPlayer instance from Media3 that decodes the picked video onto the hemisphere’s surface, looped.

Two controls are intentionally ported from a Unity reference: pitch is derived from the accelerometer gravity vector (Android XR doesn’t expose a head-pose API for this case), and zoom scales the whole hemisphere entity since there’s no skybox-shader equivalent.

Sideload the debug build

Prefer to sideload? Grab the debug APK from the v1.0 release:

👉 Download app-debug.apk (v1.0)

Heads up — this is a debug build. It’s signed with the Android debug keystore (not a release key), has android:debuggable="true", ships unminified, and is intended for sideloading and testing only. For everyday use, install the Play Store build above.

adb install -r app-debug.apk
adb shell am start -n space.mathewvarghese.androidxr3dsbsvideoplayer/.MainActivity

Source

Code, issues, and full release notes are on GitHub:

👉 github.com/mathewvarghesemanu/android-xr-sbs180-3d-player

Pull requests and bug reports welcome — especially from anyone with other OpenXR Android headsets to test on.