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 io.legado.app.R
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.MediaHelp
import io.legado.app.receiver.MediaButtonReceiver
import io.legado.app.service.notification.ReadAloudNotification
import io.legado.app.utils.postEvent
import io.legado.app.utils.toast
import kotlinx.coroutines.launch
import java.util.*
@ -66,15 +63,16 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
private var ttsIsSuccess: Boolean = false
private lateinit var audioManager: AudioManager
private lateinit var mFocusRequest: AudioFocusRequest
private var mediaSessionCompat: MediaSessionCompat? = null
var mediaSessionCompat: MediaSessionCompat? = null
private var broadcastReceiver: BroadcastReceiver? = null
private var speak: Boolean = true
private var nowSpeak: Int = 0
private val contentList = arrayListOf<String>()
private var pause = false
private var title: String = ""
private var subtitle: String = ""
private var timeMinute: Int = 0
var pause = false
var title: String = ""
var subtitle: String = ""
private var readAloudNumber: Int = 0
var timeMinute: Int = 0
override fun onCreate() {
super.onCreate()
@ -87,13 +85,7 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
initMediaSession()
initBroadcastReceiver()
upMediaSessionPlaybackState()
ReadAloudNotification.upNotification(
this,
mediaSessionCompat,
pause,
title,
subtitle
)
ReadAloudNotification.upNotification(this)
}
override fun onDestroy() {
@ -106,9 +98,9 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
intent?.action?.let { action ->
when (action) {
"play" -> {
title = intent.getStringExtra("title")
subtitle = intent.getStringExtra("subtitle")
title = intent.getStringExtra("title") ?: ""
subtitle = intent.getStringExtra("subtitle") ?: ""
newReadAloud(intent.getStringExtra("body"))
}
"pause" -> {
pauseReadAloud(true)
@ -134,6 +126,7 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
} else {
textToSpeech?.setOnUtteranceProgressListener(TTSUtteranceListener())
ttsIsSuccess = true
playTTS()
}
} else {
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
*/
@ -183,16 +196,6 @@ class ReadAloudService : BaseService(), TextToSpeech.OnInitListener, AudioManage
playTTS()
}
private fun playTTS() {
if (contentList.size < 1) {
postEvent(Bus.ALOUD_STATE, Status.NEXT)
return
}
if (ttsIsSuccess && !speak && requestFocus()) {
}
}
/**
* @return 音频焦点
*/

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