sample-app-guide
โดย facebook
การสร้างแอป DAT ที่สมบูรณ์ด้วยการสร้างเซสชัน การสตรีมกล้อง และการถ่ายภาพ
npx skills add https://github.com/facebook/meta-wearables-dat-android --skill sample-app-guideSample App Guide (Android)
Build an Android DAT app with registration, sessions, camera streaming, and photo capture.
Pair this with the CameraAccess sample.
Project setup
- Create an Android Studio app project.
- Add the DAT Maven repository and dependencies.
- Configure
AndroidManifest.xmlfor registration callbacks plusAPPLICATION_IDandCLIENT_TOKEN. - Initialize
Wearablesin yourApplication.
Suggested app structure
app/src/main/java/com/example/myapp/
├── MyApplication.kt
├── MainActivity.kt
├── session/
│ └── SessionViewModel.kt
└── ui/
├── RegistrationScreen.kt
└── CameraScreen.kt
Registration and session creation
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
Wearables.registrationState.collect { state ->
// Update registration UI
}
}
}
fun register() {
Wearables.startRegistration(this)
}
}
DeviceSession.start() is fire-and-forget. Attach the camera from the session-state collector once the session reports DeviceSessionState.STARTED; adding a capability to an IDLE session fails with DeviceSessionError.SESSION_IDLE.
class SessionViewModel : ViewModel() {
private var session: DeviceSession? = null
private var camera: Camera? = null
fun startCameraSession() {
Wearables.createSession(AutoDeviceSelector()).fold(
onSuccess = { createdSession ->
session = createdSession
viewModelScope.launch {
createdSession.errors.collect { error -> showError(error.description) }
}
viewModelScope.launch {
createdSession.state.collect { state ->
when (state) {
DeviceSessionState.STARTED -> attachCamera(createdSession)
DeviceSessionState.STOPPED -> clearSession(createdSession)
else -> Unit
}
}
}
createdSession.start()
},
onFailure = { error, _ -> showError(error.description) },
)
}
private fun attachCamera(activeSession: DeviceSession) {
if (camera != null) return
activeSession.addCamera(
StreamConfiguration(videoQuality = VideoQuality.MEDIUM, frameRate = 24),
).fold(
onSuccess = { addedCamera ->
camera = addedCamera
addedCamera.stream.start().onFailure { error, _ ->
showError(error.description)
}
},
onFailure = { error, _ -> showError(error.description) },
)
}
private fun clearSession(stoppedSession: DeviceSession) {
if (session !== stoppedSession) return
camera = null
session = null
}
}
Observe frames and capture photos
viewModelScope.launch {
camera?.stream?.videoStream?.collect { frame ->
// Render preview
}
}
fun capturePhoto() {
viewModelScope.launch {
camera?.stream?.capturePhoto()
?.onSuccess { photoData ->
when (photoData) {
is PhotoData.Bitmap -> savePhoto(photoData.bitmap)
is PhotoData.HEIC -> saveHeic(photoData.data)
}
}
?.onFailure { error, _ ->
showCaptureError(error.description)
}
}
}
Shutdown
fun stopCameraSession() {
camera?.stop()
session?.stop()
camera = null
session = null
}
Testing with MockDeviceKit
Use MockDeviceKit to simulate linking glasses, permission state, and camera media without physical hardware. See MockDevice Testing for setup details.