Develop

Horizon OS features overview

Updated: Apr 6, 2026
Meta Horizon OS is built on the Android Open Source Project, so your Android app works out of the box. But Horizon OS also provides features designed specifically for spatial computing — input from controllers and hands, spatial audio, passthrough mixed reality, and a full platform SDK for social, monetization, and identity.
This page maps the complete feature surface available to your app. Use it to find what you need and jump to the right implementation guide.

Horizon OS SDK

The Horizon OS SDK provides APIs specific to the Quest platform that aren’t available in standard Android. Add the SDK to your project to access platform detection, SDK version checking, and stereo 3D rendering.

Set up the SDK

Declare your Horizon OS SDK version requirements in AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:horizonos="http://schemas.horizonos/sdk">

    <horizonos:uses-horizonos-sdk
        horizonos:minSdkVersion="81"
        horizonos:targetSdkVersion="201" />
</manifest>
Add the hzos.jar SDK to your project dependencies. See getting started with Android apps on Horizon OS for setup instructions.

Detect Horizon OS

Check whether your app is running on Horizon OS so you can conditionally enable platform-specific features:
import horizonos.content.pm.PackageManagerExt;

boolean isHorizonOs = getPackageManager()
    .hasSystemFeature(PackageManagerExt.FEATURE_HORIZON_OS);
This is useful for apps that run on both mobile Android and Quest — enable Horizon-specific UI and features only when the platform supports them.

Check SDK version

Query the Horizon OS SDK version at runtime to gate features by OS version:
import horizonos.os.Build;

int sdkVersion = Build.HorizonOsSdk.getVersion();
Use this when your app needs features introduced in a specific Horizon OS release. Check minimum OS versions for version requirements by feature.

Stereo 3D composition

For apps that display stereoscopic 3D content (360 video, 3D media players), set the stereo composition mode on a SurfaceView:
import horizonos.view.SurfaceViewExt;

// Side-by-side 3D
SurfaceViewExt.setStereoComposition(surfaceView,
    SurfaceControlExt.STEREO_COMPOSITION_SIDE_BY_SIDE);

// Top-bottom 3D
SurfaceViewExt.setStereoComposition(surfaceView,
    SurfaceControlExt.STEREO_COMPOSITION_TOP_BOTTOM);

// Mono (default)
SurfaceViewExt.setStereoComposition(surfaceView,
    SurfaceControlExt.STEREO_COMPOSITION_MONO);

Important notes for v85+

  • 60Hz refresh rate removed. 60Hz is no longer a valid display refresh rate on any Quest device. Target 72Hz, 90Hz, or 120Hz. When selecting a refresh rate, always request a specific frequency (for example, 90) — do not use array indexing on the available rates list, as the set of available rates may change between OS versions.
  • android:configChanges required for Spatial SDK activities. Starting in Horizon OS v85, immersive activities using Meta Spatial SDK must declare android:configChanges in their manifest to prevent rapid lifecycle shutdowns. See the Spatial SDK documentation for details.
  • HzOS version compatibility. When calling Platform SDK APIs, handle the PROVIDER_OPERATION_NOT_SUPPORTED error code (1003) for features unavailable on the user’s OS version, or declare a minimum SDK version with <horizonos:uses-horizonos-sdk>. See minimum OS versions for details.

Core features

These features are available to all Android apps on Horizon OS. Most use standard Android APIs with Horizon OS-specific behavior.

Panel sizing

Control how your app’s window appears in the virtual environment. Set default dimensions, enable user resizing, and launch multiple panels.
  • Set default size with <layout> in your manifest
  • Launch additional panels with FLAG_ACTIVITY_LAUNCH_ADJACENT
  • No SDK dependency required — standard Android APIs

Input

Users interact with your app using controllers, hands, mouse, keyboard, gamepad, and stylus. Targeted input (controllers, hands) sends standard Android motion events when hovering over your panel. Untargeted input (keyboard, gamepad) sends standard input events to the focused panel.
  • Controller B/Y buttons map to Android back navigation
  • Joystick input via AXIS_HSCROLL / AXIS_VSCROLL
  • No SDK dependency required — standard Android input events
Guide:Input

Audio

Play background audio, integrate system media controls, and support Dolby Atmos spatial audio using standard Android Media3 APIs.
  • Background playback with MediaSession and MediaSessionService
  • Dolby Atmos with E-AC-3 JOC format detection
  • Audio focus management via AudioFocusRequest
  • No SDK dependency required — standard Android Media3

Authentication

Integrate third-party OAuth 2.0 login or connect to Meta accounts.
  • Standard OAuth 2.0 via the AppAuth Android library
  • Device code flow for media apps without keyboards
  • Meta account linking via Platform Solutions

Sharing

Share content to and from your app using the system share sheet. Stream your app’s view to other devices with Media Projection.
  • Receive shares via standard Android SEND_INTENT
  • Share out via the Android native share sheet
  • Screen sharing with MediaProjection API (app-level or full display)
Guide:Sharing

DRM

Play protected media content with Widevine L1 and L3 support.
  • Standard android.media.MediaDrm APIs
  • Immersive apps can disable screen capture via Developer Dashboard

Cameras

Access the Avatar Selfie camera for avatar-based photos or the passthrough camera for real-world video processing.
Avatar Selfie camera:
  • Standard Camera2/CameraX APIs, front-facing camera
  • Requires android.permission.CAMERA or horizonos.permission.AVATAR_CAMERA
  • Works even when organization disables physical cameras
Passthrough camera:
  • Real-world camera feed via Camera2 API (Quest 3, Quest 3S, Horizon OS v74+)
  • Requires android.permission.CAMERA
  • Supported resolutions include 1280x960, 1280x1080, 1280x1280, and 1024x1024 at 60Hz

Ad attestation and ad ID

If your app displays ads, complete the in-app ads attestation and use the advertising ID for attribution.
  • Attestation is required during app submission for 2D and hybrid apps containing ads
  • Ad ID is a resettable, user-scoped identifier for advertising purposes
  • Review the ads policy before integrating

Spatial features with Meta Spatial SDK

To add immersive 3D experiences to your Android app — environments, spatial panels, hand interactions, and mixed reality — integrate Meta Spatial SDK. The SDK is a Kotlin-based framework that extends your Android app with spatial computing capabilities.
Available feature modules:
ModuleWhat it does
Core + Toolkit
Entity-component system, spatial panels, scene loading, app lifecycle
VR
Controller and hand input, head tracking, VR rendering
Physics
Rigid body physics and collision detection
Animation
Skeletal and property animation
Spatial Audio
3D positioned sound, room acoustics, sound propagation
MRUK
Mixed reality utility kit — room setup, scene mesh, passthrough
ISDK
Interaction SDK — grab, poke, ray interactions
Compose
Jetpack Compose integration for spatial UI
Networking
Multiplayer state synchronization
Particles
GPU particle systems
Speech to Text
Voice input transcription
Full documentation:Spatial SDK overview

Platform Solutions

Platform Solutions provide deeper integration with Meta’s ecosystem — user identity, social features, monetization, and content management. These use the Horizon Platform SDK.

User management

FeatureWhat it doesGuide
Entitlement check
Verify the user owns your app
Account linking
Link Meta accounts to your backend
User age category
Age-gated feature control
Consent
Manage user consent flows

Social and engagement

FeatureWhat it doesGuide
Group presence
Show what users are doing, enable join-in-progress
Rich presence
Display user status across the platform
Achievements
Unlock and display achievements
Leaderboards
Competitive rankings
Challenges
Time-limited competitive events
Deep linking
Launch directly into specific app content
Developer posts
Communicate with users from your store listing

Monetization

FeatureWhat it doesGuide
In-app purchases
Sell digital items and currency
Horizon Billing SDK
Google Play Billing-compatible API
Downloadable content
Host and deliver asset files
Language packs
Downloadable localization bundles

Security

FeatureWhat it doesGuide
Device integrity
Verify your app runs on a genuine Quest device
Abuse reporting
Let users report abusive content or behavior
Passkey authentication
Phishing-resistant login via FIDO2/WebAuthn credentials

Horizon OS permissions

Horizon OS defines custom permissions beyond standard Android permissions. Declare these in your AndroidManifest.xml when your app needs access to platform-specific capabilities.
PermissionWhat it grantsRequired for
horizonos.permission.AVATAR_CAMERA
Access to the Avatar Selfie camera only (not passthrough)
Avatar photos without requesting full camera access
For standard camera access (both avatar and passthrough), use android.permission.CAMERA instead. See the camera guide and passthrough camera guide for details.

What to build next

Once you’ve reviewed the features available, here’s a recommended path:
  1. Start with the basics — Get your app running on Quest with panel sizing and input
  2. Add platform identity — Integrate entitlement checks and authentication
  3. Go spatial — Add immersive features with Meta Spatial SDK
  4. Monetize — Set up in-app purchases or Horizon Billing SDK
  5. Grow — Use achievements, leaderboards, and deep linking to drive engagement

Design guidelines

User considerations