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.**