สถานะ Audio Marker และผลลัพธ์กิจกรรม
ตั้งแต่ Android 5.0.10, iOS 5.0.9 และ Flutter 0.3.5 สำหรับ Android/iOS SDK จะจัดการสถานะ Audio Marker ปัจจุบันและการเชื่อมโยงกับกิจกรรม (activity) ที่รู้จำได้ เปิดการรู้จำ Audio Marker เมื่อแอปพลิเคชันใน SORI Console ใช้งานคุณสมบัตินี้ โดยค่าเริ่มต้นยังคงปิดอยู่
ติดตั้งหรืออัปเดต
แสดงมาร์กเกอร์ปัจจุบัน
แสดงสถานะที่ SDK ส่งมา โดยแยกสถานะไม่ได้ใช้งาน กำลังฟัง ตรวจพบมาร์กเกอร์แต่ยังระบุตัวตนไม่ได้ ระบุตัวตนแล้ว และล้างสถานะแล้ว เฉพาะสถานะที่ระบุตัวตนแล้วเท่านั้นที่มี ID และชื่อ Audio Marker ที่ SORI Console ยืนยัน หากยังระบุตัวตนไม่ได้ อย่านำชื่อมาร์กเกอร์ก่อนหน้ามาใช้
SDK สามารถเก็บข้อมูลมาร์กเกอร์ที่ยังมีผลได้สูงสุดสี่วินาทีเมื่อไม่มีการตรวจพบใหม่ แต่ไม่ได้รับประกันว่าจะแสดงครบสี่วินาที การตรวจไม่พบติดต่อกัน ระดับเสียงเข้าต่ำ (low RMS) ความเงียบ มาร์กเกอร์อื่นที่ยังระบุตัวตนไม่ได้ หรือการหยุดและรีเซ็ตการรู้จำ อาจล้างหรือทำให้สถานะใช้ไม่ได้ เมื่อเชื่อมต่อ UI อีกครั้ง ให้อ่านภาพสถานะปัจจุบัน (snapshot) หรือสมัครรับเหตุการณ์ใหม่ การอ่าน snapshot หรือรับการตอบกลับที่ล่าช้าไม่เริ่มระยะเวลาเก็บสถานะใหม่ แอปไม่จำเป็นต้องสร้างตัวจับเวลาหมดอายุเอง
อัปเดตกิจกรรมที่ตรงกัน
ขณะที่ข้อมูลมาร์กเกอร์ยังมีผล SDK จะเสริมคำขอรู้จำสื่อที่ตามมาด้วยคุณสมบัติมาร์กเกอร์ (trait.marker) หากรู้จำสื่อก่อนและระบุตัวตนมาร์กเกอร์ได้ภายหลัง SDK สามารถอัปเดตกิจกรรมเดิมได้โดยไม่ต้องจับคู่สื่อสำเร็จอีกครั้ง SDK จัดการการเชื่อมโยงและการอัปเดตเซิร์ฟเวอร์ แอปจึงไม่ต้องสร้าง trait ของมาร์กเกอร์หรือส่งคำขออัปเดตเอง
- เพิ่มหรืออัปเดตผลลัพธ์ด้วย ID กิจกรรมที่ SDK ส่งมาอย่างตรงกัน รวมถึงการอัปเดตผลลัพธ์ก่อนหน้าที่มาถึงล่าช้า อย่านำมาร์กเกอร์จากส่วนหัวปัจจุบันไปผูกกับผลลัพธ์ล่าสุดโดยอัตโนมัติ
- เก็บเวลารู้จำ ตำแหน่ง และลำดับแถวเดิมไว้เมื่อเสริมข้อมูล
- การล้างมาร์กเกอร์ปัจจุบันไม่ลบมาร์กเกอร์ที่ยอมรับแล้วในกิจกรรมย้อนหลัง ผลลัพธ์ที่ล่าช้าก็ไม่ทำให้มาร์กเกอร์นั้นกลับมาเป็นสถานะปัจจุบัน
- ผลลัพธ์กิจกรรมอาจไม่มีแคมเปญ ให้แสดงข้อมูลตัวตนและมาร์กเกอร์ที่มีอยู่โดยไม่สมมติว่ามีแคมเปญเสมอ
Android
เอกสาร API สาธารณะของ Android 5.0.12
สืบทอด SORIListener และใช้ onAudioMarkerStateChanged กับ onActivityResult อ่าน snapshot ปัจจุบันได้จาก sori.audioMarkerState (getAudioMarkerState() ใน Java) หากนำ ISORIListener ไปใช้โดยตรง ให้ใช้ interface เสริม ISORIAudioMarkerStateListener และ ISORIActivityResultListener ด้วยเพื่อรับ callback เหล่านี้
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.audioMarkerStateiOS
หลังจากกำหนดค่า recognizer ให้ตั้งค่า audioMarkerStateHandler และ activityResultHandler อ่าน currentAudioMarkerState เมื่อต้องการ snapshot ใช้ weak capture หาก handler อ้างอิง view controller
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.currentAudioMarkerStateFlutter
บน Android และ iOS ให้ใช้ audioMarkerStateChanged, activityResult และ getCurrentAudioMarkerState() โดย SORIRecognitionState จะรับเหตุการณ์ SDK และเก็บผลลัพธ์ตาม ID กิจกรรม แอปสามารถแสดง currentAudioMarker และ activities ได้
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.
}ยกเลิก markerSubscription เมื่อเลิกใช้งาน UI นั้น และคง listener ของแคมเปญเดิมไว้สำหรับเซิร์ฟเวอร์เก่าที่ไม่ส่ง ID กิจกรรม
ความเข้ากันได้
ยังใช้ขั้นตอนเริ่มและหยุด รวมถึง callback ของแคมเปญและการค้นพบเดิมได้ สำหรับ UI มาร์กเกอร์ปัจจุบันใหม่ ให้ใช้ API สถานะข้างต้น เพราะ callback การค้นพบไม่ใช่การแจ้งหมดอายุ เซิร์ฟเวอร์เก่าที่ไม่ส่ง ID กิจกรรมยังรองรับ callback แคมเปญเดิม แต่ไม่สามารถส่งผลลัพธ์กิจกรรมแบบ ID ตรงกันชุดใหม่ได้
Flutter Web ยังคงพฤติกรรมการรู้จำและเหตุการณ์เดิม สถานะปัจจุบัน การหมดอายุ และการอัปเดตมาร์กเกอร์ที่มาภายหลังอย่างอิสระแบบใหม่นี้ใช้กับ Android/iOS บน Web เมธอด getCurrentAudioMarkerState() จะคืนค่า null จึงไม่ควรตีความว่าไม่มีการตรวจพบมาร์กเกอร์
