Prism ARDocsGet the SDK
PlatformsAndroid XR

Platforms

Android XR

Integration guide for Android XR headsets including Samsung Project Moohan. Covers setup, permissions, Jetpack Compose integration, and spatial analytics.

Requirements

  • Android Studio Hedgehog (2023.1.1) or later
  • minSdk 26 (Android 8.0), targetSdk 35+
  • Android XR emulator or device
  • ARCore 1.45+ dependency

Manifest Permissions

AndroidManifest.xml
<!-- Required for all ad serving -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- Required for dimensional ads -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- Declare AR requirement (optional — remove if AR is optional in your app) -->
<uses-feature android:name="android.hardware.camera.ar" android:required="false" />

Gradle Dependencies

app/build.gradle.kts
dependencies {
    implementation("ai.prismar:sdk:1.0.0")
    // ARCore is required for dimensional placements
    implementation("com.google.ar:core:1.45.0")
    // Jetpack Compose (if using Compose UI)
    implementation("androidx.compose.ui:ui:1.7.0")
    implementation("androidx.compose.material3:material3:1.3.0")
}

Initialization

Kotlin — Application class
import ai.prismar.sdk.PrismAR
import ai.prismar.sdk.PrismConfig
import ai.prismar.sdk.Environment
import android.app.Application

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        PrismAR.initialize(
            context = this,
            appId = "YOUR_APP_ID",
            environment = Environment.PRODUCTION,
            config = PrismConfig(
                enableDimensional = true  // requires camera permission
            )
        )
    }
}

Overlay Ad — Jetpack Compose

Kotlin
import ai.prismar.sdk.PrismAdView
import ai.prismar.sdk.AdSize

@Composable
fun AppScreen() {
    Scaffold { padding ->
        Box(modifier = Modifier.padding(padding).fillMaxSize()) {
            AppContent()

            PrismAdView(
                placementId = "YOUR_OVERLAY_PLACEMENT_ID",
                adSize = AdSize.BANNER,
                modifier = Modifier
                    .align(Alignment.BottomCenter)
                    .padding(bottom = 16.dp),
                onAdLoaded = { impression ->
                    Log.d("PrismAR", "Ad loaded: ${impression.id}")
                },
                onAdFailed = { error ->
                    Log.e("PrismAR", "Ad failed: ${error.message}")
                }
            )
        }
    }
}

Dimensional Ad — ARCore Session

Kotlin
import ai.prismar.sdk.DimensionalAdManager
import ai.prismar.sdk.SurfaceType

class ARActivity : AppCompatActivity() {
    private lateinit var dimensionalAds: DimensionalAdManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        dimensionalAds = PrismAR.dimensionalManager(
            activity = this,
            placementId = "YOUR_DIMENSIONAL_PLACEMENT_ID",
            surfaceType = SurfaceType.WALL
        )
    }

    override fun onResume() {
        super.onResume()
        dimensionalAds.resume()
    }

    override fun onPause() {
        dimensionalAds.pause()
        super.onPause()
    }
}

ProGuard / R8

Add the following rules to your proguard-rules.pro to prevent class stripping:

proguard-rules.pro
-keep class ai.prismar.** { *; }
-dontwarn ai.prismar.**