pull/32/head
kunfei 5 years ago
parent 22a8c6a980
commit f5c2cf40a5
  1. 59
      app/src/main/java/io/legado/app/service/ReadAloudService.kt
  2. 54
      app/src/main/java/io/legado/app/service/notification/ReadAloudNotification.kt

@ -11,13 +11,10 @@ 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.*
@ -66,15 +63,16 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
private var ttsIsSuccess: Boolean = false private var ttsIsSuccess: Boolean = false
private lateinit var audioManager: AudioManager private lateinit var audioManager: AudioManager
private lateinit var mFocusRequest: AudioFocusRequest private lateinit var mFocusRequest: AudioFocusRequest
private var mediaSessionCompat: MediaSessionCompat? = null var mediaSessionCompat: MediaSessionCompat? = null
private var broadcastReceiver: BroadcastReceiver? = null private var broadcastReceiver: BroadcastReceiver? = null
private var speak: Boolean = true private var speak: Boolean = true
private var nowSpeak: Int = 0 private var nowSpeak: Int = 0
private val contentList = arrayListOf<String>() private val contentList = arrayListOf<String>()
private var pause = false var pause = false
private var title: String = "" var title: String = ""
private var subtitle: String = "" var subtitle: String = ""
private var timeMinute: Int = 0 private var readAloudNumber: Int = 0
var timeMinute: Int = 0
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -87,13 +85,7 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
initMediaSession() initMediaSession()
initBroadcastReceiver() initBroadcastReceiver()
upMediaSessionPlaybackState() upMediaSessionPlaybackState()
ReadAloudNotification.upNotification( ReadAloudNotification.upNotification(this)
this,
mediaSessionCompat,
pause,
title,
subtitle
)
} }
override fun onDestroy() { override fun onDestroy() {
@ -106,9 +98,9 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
intent?.action?.let { action -> intent?.action?.let { action ->
when (action) { when (action) {
"play" -> { "play" -> {
title = intent.getStringExtra("title") title = intent.getStringExtra("title") ?: ""
subtitle = intent.getStringExtra("subtitle") subtitle = intent.getStringExtra("subtitle") ?: ""
newReadAloud(intent.getStringExtra("body"))
} }
"pause" -> { "pause" -> {
pauseReadAloud(true) pauseReadAloud(true)
@ -134,6 +126,7 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
} else { } else {
textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener()) textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener())
ttsIsSuccess = true ttsIsSuccess = true
playTTS()
} }
} else { } else {
toast(R.string.tts_init_failed) toast(R.string.tts_init_failed)
@ -141,6 +134,26 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
} }
} }
private fun newReadAloud(body: String?) {
if (body.isNullOrEmpty()) {
stopSelf()
} else {
nowSpeak = 0
readAloudNumber = 0
contentList.clear()
contentList.addAll(body.split("\n"))
}
}
private fun playTTS() {
if (contentList.size < 1 || !ttsIsSuccess) {
return
}
if (!pause && requestFocus()) {
ReadAloudNotification.upNotification(this)
}
}
/** /**
* 初始化MediaSession * 初始化MediaSession
*/ */
@ -183,16 +196,6 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
playTTS() playTTS()
} }
private fun playTTS() {
if (contentList.size < 1) {
postEvent(Bus.ALOUD_STATE, Status.NEXT)
return
}
if (ttsIsSuccess && !speak && requestFocus()) {
}
}
/** /**
* @return 音频焦点 * @return 音频焦点
*/ */

@ -1,72 +1,64 @@
package io.legado.app.service.notification package io.legado.app.service.notification
import android.app.Service
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.support.v4.media.session.MediaSessionCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.help.PendingIntentHelp import io.legado.app.help.PendingIntentHelp
import io.legado.app.service.ReadAloudService
object ReadAloudNotification { object ReadAloudNotification {
/** /**
* 更新通知 * 更新通知
*/ */
fun upNotification( fun upNotification(service: ReadAloudService) {
context: Service,
mediaSessionCompat: MediaSessionCompat?,
pause: Boolean,
title: String,
subtitle: String,
timeMinute: Int = 0
) {
var nTitle: String = when { var nTitle: String = when {
pause -> context.getString(R.string.read_aloud_pause) service.pause -> service.getString(R.string.read_aloud_pause)
timeMinute in 1..60 -> context.getString(R.string.read_aloud_timer, timeMinute) service.timeMinute in 1..60 -> service.getString(R.string.read_aloud_timer, service.timeMinute)
else -> context.getString(R.string.read_aloud_t) else -> service.getString(R.string.read_aloud_t)
} }
nTitle += ": $title" nTitle += ": ${service.title}"
var nSubtitle = subtitle var nSubtitle = service.subtitle
if (subtitle.isEmpty()) if (service.subtitle.isEmpty())
nSubtitle = context.getString(R.string.read_aloud_s) nSubtitle = service.getString(R.string.read_aloud_s)
val builder = NotificationCompat.Builder(context, AppConst.channelIdReadAloud) val builder = NotificationCompat.Builder(service, AppConst.channelIdReadAloud)
.setSmallIcon(R.drawable.ic_volume_up) .setSmallIcon(R.drawable.ic_volume_up)
.setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.icon_read_book)) .setLargeIcon(BitmapFactory.decodeResource(service.resources, R.drawable.icon_read_book))
.setOngoing(true) .setOngoing(true)
.setContentTitle(nTitle) .setContentTitle(nTitle)
.setContentText(nSubtitle) .setContentText(nSubtitle)
.setContentIntent(PendingIntentHelp.readBookActivityPendingIntent(context)) .setContentIntent(PendingIntentHelp.readBookActivityPendingIntent(service))
if (pause) { if (service.pause) {
builder.addAction( builder.addAction(
R.drawable.ic_play_24dp, R.drawable.ic_play_24dp,
context.getString(R.string.resume), service.getString(R.string.resume),
PendingIntentHelp.aloudServicePendingIntent(context, "resume") PendingIntentHelp.aloudServicePendingIntent(service, "resume")
) )
} else { } else {
builder.addAction( builder.addAction(
R.drawable.ic_pause_24dp, R.drawable.ic_pause_24dp,
context.getString(R.string.pause), service.getString(R.string.pause),
PendingIntentHelp.aloudServicePendingIntent(context, "pause") PendingIntentHelp.aloudServicePendingIntent(service, "pause")
) )
} }
builder.addAction( builder.addAction(
R.drawable.ic_stop_black_24dp, R.drawable.ic_stop_black_24dp,
context.getString(R.string.stop), service.getString(R.string.stop),
PendingIntentHelp.aloudServicePendingIntent(context, "stop") PendingIntentHelp.aloudServicePendingIntent(service, "stop")
) )
builder.addAction( builder.addAction(
R.drawable.ic_time_add_24dp, R.drawable.ic_time_add_24dp,
context.getString(R.string.set_timer), service.getString(R.string.set_timer),
PendingIntentHelp.aloudServicePendingIntent(context, "setTimer") PendingIntentHelp.aloudServicePendingIntent(service, "setTimer")
) )
builder.setStyle( builder.setStyle(
androidx.media.app.NotificationCompat.MediaStyle() androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSessionCompat?.sessionToken) .setMediaSession(service.mediaSessionCompat?.sessionToken)
.setShowActionsInCompactView(0, 1, 2) .setShowActionsInCompactView(0, 1, 2)
) )
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
val notification = builder.build() val notification = builder.build()
context.startForeground(112201, notification) service.startForeground(112201, notification)
} }
} }
Loading…
Cancel
Save