Skip to content

오디오마커 상태와 활동 결과

Android 5.0.10, iOS 5.0.9 및 Android/iOS용 Flutter 0.3.5부터 SDK가 현재 오디오마커 상태와 인식된 활동(activity)의 연결을 관리합니다. SORI Console 애플리케이션에서 오디오마커를 사용하는 경우 인식을 활성화하세요. 기본적으로는 비활성화되어 있습니다.

설치 및 업데이트

현재 마커 표시

SDK가 전달하는 상태를 화면에 반영하세요. 인식 비활성, 수신 대기, 식별 정보가 아직 확인되지 않은 마커 감지, 마커 식별 완료, 상태 해제를 구분합니다. 식별 완료 상태에만 SORI Console이 확인한 오디오마커 ID와 이름이 포함됩니다. 미식별 마커가 감지되었을 때 이전 마커 이름을 재사용하지 마세요.

SDK는 새 감지가 없을 때 유효한 마커 근거를 최대 4초간 유지할 수 있지만, 화면에 항상 4초간 표시한다는 보장은 아닙니다. 연속 미감지, 낮은 입력 레벨(low RMS), 무음, 다른 미식별 마커, 인식 중지·초기화 등의 조건에 따라 상태가 해제되거나 무효화될 수 있습니다. UI를 다시 연결할 때는 현재 스냅샷(snapshot)을 읽거나 다시 구독하세요. 스냅샷 조회나 늦은 응답 수신은 유지 시간을 다시 시작하지 않습니다. 앱에서 별도 만료 타이머를 구현할 필요가 없습니다.

해당 활동 갱신

마커 근거가 유효한 동안 SDK는 이후 소재 인식 요청의 마커 속성(trait.marker)을 보강합니다. 소재가 먼저 인식되고 마커가 나중에 식별되면, 소재가 다시 인식되지 않아도 같은 활동을 갱신할 수 있습니다. SDK가 연결과 서버 갱신을 관리하므로 앱에서 마커 trait을 만들거나 별도 갱신 요청을 보낼 필요가 없습니다.

  • SDK가 제공한 정확한 활동 ID로 결과를 추가하거나 갱신하세요. 이전 결과에 대한 늦은 갱신도 같은 ID에 반영합니다. 현재 헤더의 마커를 가장 최근 결과에 임의로 연결하지 마세요.
  • 보강 시 최초 인식 시간, 위치 및 행 순서를 유지하세요.
  • 현재 마커가 해제되어도 과거 활동에 이미 반영된 마커는 삭제하지 않습니다. 늦은 활동 결과가 해당 마커를 다시 현재 상태로 만들지도 않습니다.
  • 활동 결과에 캠페인이 없을 수 있습니다. 캠페인이 항상 존재한다고 가정하지 말고 제공된 식별 정보와 마커 필드를 표시하세요.

Android

Android 5.0.12 공개 API 레퍼런스

SORIListener를 확장하고 onAudioMarkerStateChangedonActivityResult를 사용하세요. 현재 스냅샷은 sori.audioMarkerState(Java에서는 getAudioMarkerState())로 조회합니다. ISORIListener를 직접 구현한다면 이 콜백을 받기 위해 선택적 인터페이스인 ISORIAudioMarkerStateListenerISORIActivityResultListener도 구현하세요.

kotlin
import android.util.Log
import com.iplateia.sorisdk.SORIAudioMarkerState
import com.iplateia.sorisdk.SORIActivityResult
import com.iplateia.sorisdk.SORIListener
import com.iplateia.sorisdk.SORIConfig

sori.setConfig(SORIConfig(audiomarker = true))
sori.setListener(this, object : SORIListener() {
    override fun onAudioMarkerStateChanged(state: SORIAudioMarkerState) {
        // Render the current state; marker is null until identified.
        Log.d("SORI", "${state.status}: ${state.marker?.name}")
    }

    override fun onActivityResult(result: SORIActivityResult) {
        // Insert or update the row identified by result.activityId.
        Log.d("SORI", "${result.activityId}: ${result.audioMarker?.name}")
    }
})
val current = sori.audioMarkerState

iOS

recognizer 구성 후 audioMarkerStateHandleractivityResultHandler를 연결하세요. 스냅샷이 필요하면 currentAudioMarkerState를 읽습니다. 핸들러에서 뷰 컨트롤러를 참조한다면 약한 참조를 사용하세요.

swift
recognizer.audiomarker = true
recognizer.audioMarkerStateHandler = { snapshot in
    // Render the current state; audioMarker is nil until identified.
    print(snapshot.state, snapshot.audioMarker?.name ?? "")
}
recognizer.activityResultHandler = { result in
    // Insert or update the row identified by result.activityID.
    print(result.activityID, result.audioMarker?.name ?? "")
}
let current = recognizer.currentAudioMarkerState

Flutter

Android와 iOS에서는 audioMarkerStateChanged, activityResult, getCurrentAudioMarkerState()를 사용하세요. SORIRecognitionState가 SDK 이벤트를 반영하고 활동 ID별로 결과를 관리하므로 앱은 currentAudioMarkeractivities를 표시하면 됩니다.

dart
await recognizer.configure(
  config: const SORIRecognitionConfig(audiomarker: true),
);

final markerView = SORIRecognitionState();
final markerSubscription = recognizer.events.listen((event) {
  if (markerView.accept(event)) {
    // Rebuild your UI from markerView.currentAudioMarker and
    // markerView.activities. Each result keeps its own activityId.
  }
});

final current = await recognizer.getCurrentAudioMarkerState();
if (current != null && markerView.acceptAudioMarkerState(current)) {
  // Rebuild the current-marker UI from markerView.currentAudioMarker.
}

UI 범위가 해제될 때 markerSubscription을 취소하세요. 활동 ID를 생략하는 이전 서버를 위해 기존 캠페인 리스너도 유지하세요.

호환성

기존 시작·중지 흐름과 캠페인·발견 콜백은 계속 사용할 수 있습니다. 새로운 현재 마커 UI에는 위 상태 API를 사용하세요. 발견 콜백은 만료 알림이 아닙니다. 활동 ID를 생략하는 이전 서버에서도 기존 캠페인 콜백은 지원되지만, 정확한 ID를 사용하는 새 활동 결과는 제공할 수 없습니다.

Flutter Web은 기존 인식 및 이벤트 동작을 유지합니다. 새로운 현재 상태·만료·독립적인 지연 마커 갱신 동작은 Android/iOS에 적용됩니다. Web에서 getCurrentAudioMarkerState()null을 반환하므로 이를 마커가 감지되지 않았다는 의미로 해석하지 마세요.