Skip to content

구현

AudioRecognition instance 생성

SORI 애플리케이션 인증 정보로 SORIAudioRecognizer를 생성합니다. 실제 인증 정보를 공개 소스 코드에 하드코딩하지 마세요. 릴리즈 설정, 보안 저장소, 환경별 빌드 프로세스를 통해 로드하세요.

아래 예시는 소스 코드에 민감한 값이 남지 않도록 --dart-define 값을 사용합니다.

dart
import 'package:sorisdk_flutter/sorisdk_flutter.dart';

const applicationId = String.fromEnvironment('SORI_APP_ID');
const secretKey = String.fromEnvironment('SORI_SECRET_KEY');

final recognizer = SORIAudioRecognizer(
  applicationId: applicationId,
  secretKey: secretKey,
);

await recognizer.configure();

로컬 또는 CI 환경에서 값을 전달해 앱을 실행합니다.

bash
flutter run \
  --dart-define=SORI_APP_ID=your-application-id \
  --dart-define=SORI_SECRET_KEY=your-secret-key

WARNING

app_idsecret_key는 앱을 SORI API Server에 인증하는 값입니다. 실제 값을 저장소, 샘플 앱, 이슈, 스크린샷, 공개 문서에 커밋하지 마세요.

인식 이벤트 수신

인식을 시작하기 전에 recognizer.events를 구독하세요. 캠페인 정보는 네이티브 플랫폼 이벤트에 따라 event.campaign 또는 이벤트 payload에서 확인할 수 있습니다.

dart
import 'dart:async';

import 'package:sorisdk_flutter/sorisdk_flutter.dart';

late final SORIAudioRecognizer recognizer;
StreamSubscription<SORIRecognitionEvent>? subscription;

subscription = recognizer.events.listen((event) {
  if (event.type == SORIRecognitionEventType.stateChanged) {
    final state = event.payload['state'];
    // STARTING, STARTED, stopped 상태에 맞춰 UI를 업데이트합니다.
  }

  final campaign = event.campaign;
  if (campaign != null) {
    // campaign.name, campaign.imageUrl, campaign.actionUrl을 표시합니다.
  }

  if (event.type == SORIRecognitionEventType.error ||
      event.type == SORIRecognitionEventType.networkError) {
    // 앱의 오류 UI에 event.message를 표시합니다.
  }
});

위젯 또는 애플리케이션 scope가 종료될 때 subscription을 해제합니다.

dart
await subscription?.cancel();

인식 시작과 중지

recognizer 구성이 끝나고 UI가 이벤트를 받을 준비가 되면 startRecognition()을 호출합니다.

dart
await recognizer.startRecognition(
  notification: const SORIAndroidNotificationOptions(
    title: 'SORI recognition',
    body: 'Listening for SORI audio signals',
  ),
);

notification 옵션은 Android foreground-service 알림에 사용됩니다. iOS에서는 무시됩니다.

인식을 중지하려면 다음을 호출합니다.

dart
await recognizer.stopRecognition();

현재 recorder 상태도 확인할 수 있습니다.

dart
final isRunning = await recognizer.isRecorderRunning();

캠페인 액션 처리

캠페인에 action URL이 있으면, 앱에서 해당 URL을 열지 먼저 결정하세요. 앱이 URL을 허용한 뒤 handleActionUrl()을 호출하면 SDK를 통해 상호작용이 보고되고 처리됩니다.

dart
final actionUrl = campaign.actionUrl;
if (actionUrl != null && actionUrl.isNotEmpty) {
  await recognizer.handleActionUrl(actionUrl);
}

인식 데이터베이스 업데이트

SDK는 네이티브 recognizer에 로컬 인식 데이터베이스 업데이트를 요청할 수 있습니다.

dart
final result = await recognizer.updateDatabase();

if (!result.success) {
  // result.errorMessage를 확인하고 필요하면 재시도 옵션을 표시합니다.
}