diff --git a/android/oral-trainer-sdk/src/main/AndroidManifest.xml b/android/oral-trainer-sdk/src/main/AndroidManifest.xml
index fbb2ef8..6622c6b 100644
--- a/android/oral-trainer-sdk/src/main/AndroidManifest.xml
+++ b/android/oral-trainer-sdk/src/main/AndroidManifest.xml
@@ -1,3 +1,5 @@
+
+
diff --git a/android/oral-trainer-sdk/src/main/java/cn/learningpad/oraltrainer/sdk/OralTrainerController.kt b/android/oral-trainer-sdk/src/main/java/cn/learningpad/oraltrainer/sdk/OralTrainerController.kt
index cabad2e..35b11b6 100644
--- a/android/oral-trainer-sdk/src/main/java/cn/learningpad/oraltrainer/sdk/OralTrainerController.kt
+++ b/android/oral-trainer-sdk/src/main/java/cn/learningpad/oraltrainer/sdk/OralTrainerController.kt
@@ -69,6 +69,7 @@ class OralTrainerController internal constructor(
)
player = ExoPlayer.Builder(appContext)
.setMediaSourceFactory(mediaSourceFactory)
+ .setWakeMode(C.WAKE_MODE_NETWORK)
.build()
.also { exoPlayer ->
exoPlayer.repeatMode = Player.REPEAT_MODE_ALL
diff --git a/android/sample-app/src/main/AndroidManifest.xml b/android/sample-app/src/main/AndroidManifest.xml
index c2b6721..cfed37d 100644
--- a/android/sample-app/src/main/AndroidManifest.xml
+++ b/android/sample-app/src/main/AndroidManifest.xml
@@ -1,6 +1,9 @@
+
+
+
+
+
= Build.VERSION_CODES.Q) {
+ startForeground(
+ NOTIFICATION_ID,
+ notification,
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK,
+ )
+ } else {
+ startForeground(NOTIFICATION_ID, notification)
+ }
+ return START_NOT_STICKY
+ }
+
+ private fun buildNotification(): Notification {
+ val contentIntent = PendingIntent.getActivity(
+ this,
+ 0,
+ Intent(this, MainActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
+ PendingIntent.FLAG_IMMUTABLE,
+ )
+ return Notification.Builder(this, CHANNEL_ID)
+ .setContentTitle(getString(R.string.training_playback_notification_title))
+ .setContentText(getString(R.string.training_playback_notification_text))
+ .setSmallIcon(R.drawable.ic_notification_play)
+ .setContentIntent(contentIntent)
+ .setOngoing(true)
+ .setCategory(Notification.CATEGORY_TRANSPORT)
+ .build()
+ }
+
+ companion object {
+ private const val CHANNEL_ID = "training_playback"
+ private const val NOTIFICATION_ID = 1001
+
+ fun start(context: Context) {
+ val intent = Intent(context, TrainingPlaybackService::class.java)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ context.startForegroundService(intent)
+ } else {
+ context.startService(intent)
+ }
+ }
+
+ fun stop(context: Context) {
+ context.stopService(Intent(context, TrainingPlaybackService::class.java))
+ }
+ }
+}
diff --git a/android/sample-app/src/main/res/drawable/ic_notification_play.xml b/android/sample-app/src/main/res/drawable/ic_notification_play.xml
new file mode 100644
index 0000000..ecb7c2f
--- /dev/null
+++ b/android/sample-app/src/main/res/drawable/ic_notification_play.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/android/sample-app/src/main/res/values-zh/strings.xml b/android/sample-app/src/main/res/values-zh/strings.xml
index 1930ce0..093cefd 100644
--- a/android/sample-app/src/main/res/values-zh/strings.xml
+++ b/android/sample-app/src/main/res/values-zh/strings.xml
@@ -1,4 +1,7 @@
八哥口语
+ 训练播放
+ 口语训练
+ 正在后台播放
diff --git a/android/sample-app/src/main/res/values/strings.xml b/android/sample-app/src/main/res/values/strings.xml
index fdb55f2..82d0987 100644
--- a/android/sample-app/src/main/res/values/strings.xml
+++ b/android/sample-app/src/main/res/values/strings.xml
@@ -1,3 +1,6 @@
MynaTalk
+ Training playback
+ Oral training
+ Playing in the background