การนำไปใช้
สร้าง instance ของ AudioRecognition
สร้าง SORIAudioRecognizer ด้วย credentials ของแอปพลิเคชัน SORI อย่า hardcode credentials จริงใน source code สาธารณะ ให้โหลดผ่านการกำหนดค่า release, secure storage หรือกระบวนการ build เฉพาะ environment
ตัวอย่างด้านล่างใช้ค่า --dart-define เพื่อไม่ให้ source code มีค่าที่เป็นข้อมูลลับ:
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();เรียกใช้แอปด้วยค่าที่จัดเตรียมไว้ใน local หรือ CI environment:
flutter run \
--dart-define=SORI_APP_ID=your-application-id \
--dart-define=SORI_SECRET_KEY=your-secret-keyWARNING
app_id และ secret_key ใช้ยืนยันตัวตนของแอปกับ SORI API Server ห้าม commit ค่าจริงลงใน repository แอปตัวอย่าง issue ภาพหน้าจอ หรือเอกสารสาธารณะ
รับฟังเหตุการณ์การรู้จำ
subscribe recognizer.events ก่อนเริ่มการรู้จำ ข้อมูลแคมเปญอยู่ใน event.campaign หรือ event payload ทั้งนี้ขึ้นอยู่กับ event ของ native platform
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'];
// Update your UI for STARTING, STARTED, or stopped states.
}
final campaign = event.campaign;
if (campaign != null) {
// Render campaign.name, campaign.imageUrl, and campaign.actionUrl.
final marker = campaign.trait?.marker;
if (marker != null) {
// Optionally use the Audio Marker code attached to this campaign.
}
}
if (event.type == SORIRecognitionEventType.audioMarkerChanged) {
final marker = event.audioMarker;
// Update marker-specific UI or state.
}
if (event.type == SORIRecognitionEventType.error ||
event.type == SORIRecognitionEventType.networkError) {
// Show event.message in your app's error UI.
}
});ยกเลิก subscription เมื่อ widget หรือ scope ของแอปพลิเคชันถูก dispose:
await subscription?.cancel();เริ่มและหยุดการรู้จำ
เรียก startRecognition() หลังจากกำหนดค่า recognizer และ UI พร้อมรับ events แล้ว
await recognizer.startRecognition(
notification: const SORIAndroidNotificationOptions(
title: 'SORI recognition',
body: 'Listening for SORI audio signals',
),
);ตัวเลือก notification ใช้กับการแจ้งเตือนของ Android foreground service และจะถูกละเว้นบน iOS
หากต้องการหยุดการรู้จำ:
await recognizer.stopRecognition();คุณยังสามารถตรวจสอบสถานะ recorder ปัจจุบันได้:
final isRunning = await recognizer.isRecorderRunning();เปิดใช้งานการรู้จำ Audio Marker
การรู้จำ Audio Marker ถูกปิดไว้โดยค่าเริ่มต้น ให้เปิดใช้งานเฉพาะเมื่อการตั้งค่า SORI Console ใช้ Audio Markers
await recognizer.configure(
config: const SORIRecognitionConfig(audiomarker: true),
);เมื่อเปิดใช้งาน การเปลี่ยนแปลงสถานะเฉพาะมาร์กเกอร์จะถูกส่งเป็น SORIRecognitionEventType.audioMarkerChanged และอ่านมาร์กเกอร์ล่าสุดได้ จาก event.audioMarker หากพบแคมเปญพร้อมมาร์กเกอร์ ก็สามารถอ่านมาร์กเกอร์เดียวกัน ได้จาก event.campaign?.trait?.marker เช่นกัน
จัดการการดำเนินการของแคมเปญ
เมื่อแคมเปญมี action URL ให้แอปตัดสินใจว่าควรเปิด URL หรือไม่ หลังจากแอปยอมรับ URL แล้ว ให้เรียก handleActionUrl() เพื่อรายงานและจัดการ interaction ผ่าน SDK
final actionUrl = campaign.actionUrl;
if (actionUrl != null && actionUrl.isNotEmpty) {
await recognizer.handleActionUrl(actionUrl);
}อัปเดตฐานข้อมูลการรู้จำ
SDK สามารถสั่งให้ native recognizer อัปเดตฐานข้อมูลการรู้จำในเครื่องได้
final result = await recognizer.updateDatabase();
if (!result.success) {
// Inspect result.errorMessage and show a retry option if needed.
}