|
|
@ -11,10 +11,13 @@ import android.support.v4.media.session.MediaSessionCompat |
|
|
|
import android.support.v4.media.session.PlaybackStateCompat |
|
|
|
import android.support.v4.media.session.PlaybackStateCompat |
|
|
|
import io.legado.app.R |
|
|
|
import io.legado.app.R |
|
|
|
import io.legado.app.base.BaseService |
|
|
|
import io.legado.app.base.BaseService |
|
|
|
|
|
|
|
import io.legado.app.constant.Bus |
|
|
|
|
|
|
|
import io.legado.app.constant.Status |
|
|
|
import io.legado.app.help.IntentHelp |
|
|
|
import io.legado.app.help.IntentHelp |
|
|
|
import io.legado.app.help.MediaHelp |
|
|
|
import io.legado.app.help.MediaHelp |
|
|
|
import io.legado.app.receiver.MediaButtonReceiver |
|
|
|
import io.legado.app.receiver.MediaButtonReceiver |
|
|
|
import io.legado.app.service.notification.ReadAloudNotification |
|
|
|
import io.legado.app.service.notification.ReadAloudNotification |
|
|
|
|
|
|
|
import io.legado.app.utils.postEvent |
|
|
|
import io.legado.app.utils.toast |
|
|
|
import io.legado.app.utils.toast |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
import java.util.* |
|
|
|
import java.util.* |
|
|
@ -145,12 +148,21 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("DEPRECATION") |
|
|
|
private fun playTTS() { |
|
|
|
private fun playTTS() { |
|
|
|
if (contentList.size < 1 || !ttsIsSuccess) { |
|
|
|
if (contentList.size < 1 || !ttsIsSuccess) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
if (!pause && requestFocus()) { |
|
|
|
if (!pause && requestFocus()) { |
|
|
|
|
|
|
|
postEvent(Bus.ALOUD_STATE, Status.PLAY) |
|
|
|
ReadAloudNotification.upNotification(this) |
|
|
|
ReadAloudNotification.upNotification(this) |
|
|
|
|
|
|
|
for (i in nowSpeak until contentList.size) { |
|
|
|
|
|
|
|
if (i == 0) { |
|
|
|
|
|
|
|
textToSpeech?.speak(contentList[i], TextToSpeech.QUEUE_FLUSH, null, "content") |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
textToSpeech?.speak(contentList[i], TextToSpeech.QUEUE_ADD, null, "content") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -189,6 +201,7 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun pauseReadAloud(pause: Boolean) { |
|
|
|
private fun pauseReadAloud(pause: Boolean) { |
|
|
|
|
|
|
|
this.pause = pause |
|
|
|
textToSpeech?.stop() |
|
|
|
textToSpeech?.stop() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -230,12 +243,18 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage |
|
|
|
when (focusChange) { |
|
|
|
when (focusChange) { |
|
|
|
AudioManager.AUDIOFOCUS_GAIN -> { |
|
|
|
AudioManager.AUDIOFOCUS_GAIN -> { |
|
|
|
// 重新获得焦点, 可做恢复播放,恢复后台音量的操作 |
|
|
|
// 重新获得焦点, 可做恢复播放,恢复后台音量的操作 |
|
|
|
|
|
|
|
if (!pause) { |
|
|
|
|
|
|
|
resumeReadAloud() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
AudioManager.AUDIOFOCUS_LOSS -> { |
|
|
|
AudioManager.AUDIOFOCUS_LOSS -> { |
|
|
|
// 永久丢失焦点除非重新主动获取,这种情况是被其他播放器抢去了焦点, 为避免与其他播放器混音,可将音乐暂停 |
|
|
|
// 永久丢失焦点除非重新主动获取,这种情况是被其他播放器抢去了焦点, 为避免与其他播放器混音,可将音乐暂停 |
|
|
|
} |
|
|
|
} |
|
|
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { |
|
|
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { |
|
|
|
// 暂时丢失焦点,这种情况是被其他应用申请了短暂的焦点,可压低后台音量 |
|
|
|
// 暂时丢失焦点,这种情况是被其他应用申请了短暂的焦点,可压低后台音量 |
|
|
|
|
|
|
|
if (!pause) { |
|
|
|
|
|
|
|
pauseReadAloud(false) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { |
|
|
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { |
|
|
|
// 短暂丢失焦点,这种情况是被其他应用申请了短暂的焦点希望其他声音能压低音量(或者关闭声音)凸显这个声音(比如短信提示音), |
|
|
|
// 短暂丢失焦点,这种情况是被其他应用申请了短暂的焦点希望其他声音能压低音量(或者关闭声音)凸显这个声音(比如短信提示音), |
|
|
|