バックグラウンドデータベース更新
sorisdk 4.2.1以降、新しいupdateDatabase
メソッドを使用してバックグラウンドでオーディオ認識データベースを更新できます。この機能により、認識プロセスを中断することなく、オーディオ認識マテリアルを最新の状態に保つことができます。
概要
SORIAudioRecognizer.shared().updateDatabase(context)
メソッドを使用すると、オーディオ認識が現在実行中かどうかに関係なく、いつでもサーバーからオーディオ認識データベースを更新できます。これは、長時間継続的にオーディオ認識を実行するデバイスで特に有用です。
例えば、オーディオ認識がアクティブな状態でサーバーに新しいオーディオマテリアルが追加された場合、このメソッドを呼び出すことで、認識プロセスを再開することなく、新しいオーディオマテリアルを即座に使用できます。
手動データベース更新
updateDatabase
メソッドを呼び出すことで、いつでも手動でデータベースを更新できます:
val updateResult = SORIAudioRecognizer.shared().updateDatabase(this)
if (updateResult.success) {
if (updateResult.updateAvailable) {
Log.i("SORI", "Database updated successfully to version: ${updateResult.currentVersion}")
} else {
Log.d("SORI", "Database is already up to date (version: ${updateResult.currentVersion})")
}
} else {
Log.e("SORI", "Database update failed: ${updateResult.errorMessage}")
}
WorkManagerを使用した定期的なバックグラウンド更新
自動的な定期更新には、AndroidのWorkManagerを使用してバックグラウンドデータベース更新をスケジュールできます。この方法により、手動介入なしでオーディオ認識データベースを最新の状態に保つことができます。
定期更新の設定
MainActivity.kt
ファイルに次のコードを追加して、定期的なデータベース更新を設定します:
private fun setupPeriodicDatabaseUpdate() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val workRequest = PeriodicWorkRequestBuilder<UpdateDatabaseWorker>(2, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"UpdateSORIDatabase",
ExistingPeriodicWorkPolicy.KEEP,
workRequest
)
Log.d("SORI", "Periodic database update scheduled every 2 hours")
}
バッテリー最適化
ワーカーが頻繁に実行されるよう設定すると、バッテリー消費などのAndroidバイタルに悪影響を与える可能性があります。最適なデバイスパフォーマンスを維持するため、2時間以上の間隔を使用することを推奨します。
ワーカークラスの作成
プロジェクトに次の実装を含む新しいUpdateDatabaseWorker.kt
ファイルを作成します:
package com.iplateia.soriexample
import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.iplateia.sorisdk.SORIAudioRecognizer
/**
* SORIオーディオ認識データベースを定期的に更新するワーカークラスです。
* このワーカーは2時間ごとに実行され、新しいオーディオパック更新の確認とダウンロードを行います。
*/
class UpdateDatabaseWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
companion object {
private const val TAG = "UpdateDatabaseWorker"
}
override suspend fun doWork(): Result {
return try {
Log.d(TAG, "Starting periodic database update check")
// SORI認識機のインスタンスを取得
val recognizer = SORIAudioRecognizer.shared()
// データベース更新を実行
val updateResult = recognizer.updateDatabase(applicationContext)
if (updateResult.success) {
if (updateResult.updateAvailable) {
Log.i(TAG, "Database updated successfully to version: ${updateResult.currentVersion}")
} else {
Log.d(TAG, "Database is already up to date (version: ${updateResult.currentVersion})")
}
Result.success()
} else {
Log.e(TAG, "Database update failed: ${updateResult.errorMessage}")
// 一時的な失敗には再試行、永続的な失敗には成功を返す
if (updateResult.errorMessage?.contains("Authentication failed") == true) {
Result.failure() // 認証失敗は再試行しない
} else {
Result.retry() // ネットワーク問題などは再試行
}
}
} catch (e: Exception) {
Log.e(TAG, "Unexpected error during database update", e)
Result.retry()
}
}
}
WorkManager依存関係の追加
build.gradle
ファイルにWorkManager依存関係を追加してください:
dependencies {
implementation "androidx.work:work-runtime-ktx:2.9.0"
}
初期化
MainActivity.onCreate()
メソッドまたはアプリケーションの初期化コードでsetupPeriodicDatabaseUpdate()
メソッドを呼び出します:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ... 既存のコード ...
// 定期的なデータベース更新を設定
setupPeriodicDatabaseUpdate()
}
ベストプラクティス
ネットワーク制約: 不要なデータ使用を避けるため、接続時のみ更新が発生するよう常にネットワーク制約を設定します。
エラー処理: 一時的なネットワーク問題(再試行)と永続的な失敗(再試行しない)を区別する適切なエラー処理を実装します。
ログ記録: 更新プロセスを監視し、問題を診断するために適切なログ記録を含めます。
更新頻度: 更新頻度を設定する際は、ユーザーのバッテリー寿命とデータ使用量を考慮します。2時間以上の間隔を推奨します。
ユーザーエクスペリエンス: データベース更新はバックグラウンドで発生するため、アプリのUXに関連する場合は、データベースが最後に更新された時間に関する情報をユーザーに提供することを検討します。
トラブルシューティング
バックグラウンド更新で問題が発生した場合:
- ネットワーク接続の確認: デバイスが安定したインターネット接続を持っていることを確認します。
- API認証情報の確認: APIキーとシークレットが正しく設定されていることを確認します。
- ログの確認: 問題を特定するのに役立つ具体的なエラーメッセージをログで確認します。
- WorkManager制約: WorkManager制約がユースケースに適切であることを確認します。
APIリファレンス
updateDatabase
メソッドとその戻り値の詳細については、APIリファレンスを参照してください。