Я добавляю поддержку Chromecast в существующее приложение Android. Во время трансляции мы отображаем субтитры на экране получателя. У меня проблемы с настройкой цвета фона для субтитров.
Когда я пытался установить красный фон, это работало правильно. Но когда я заменяю Color.RED на Color.TRANSPARENT, чего я и хочу, фон субтитров был черным. Почему это происходит, и как я могу получить прозрачный фон на мои субтитры?
Вот соответствующая часть моего кода, написанная в Kotlin:
import android.graphics.Color
import com.google.android.gms.cast.*
import com.google.android.gms.cast.MediaStatus.*
import com.google.android.gms.cast.TextTrackStyle.EDGE_TYPE_NONE
import com.google.android.gms.cast.TextTrackStyle.FONT_STYLE_BOLD
import com.google.android.gms.cast.framework.*
import com.google.android.gms.cast.framework.media.CastMediaOptions
import com.google.android.gms.cast.framework.media.NotificationOptions
import com.google.android.gms.cast.framework.media.RemoteMediaClient
private fun getTextTrackStyle(): TextTrackStyle = TextTrackStyle().apply {
foregroundColor = Color.WHITE
backgroundColor = Color.RED // FIXME why does .TRANSPARENT display as black? .RED displays as red...
edgeType = EDGE_TYPE_NONE
fontScale = 0.4F // size multiplier
fontStyle = FONT_STYLE_BOLD
}
private fun buildMediaInfo(loadParams: LoadParams): MediaInfo {
val videoMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
videoMetadata.putString(MediaMetadata.KEY_TITLE, loadParams.title)
val subtitleTrack =
MediaTrack
.Builder(SUBTITLE_TRACK_ID, MediaTrack.TYPE_TEXT)
.setName("Song Attribution")
.setContentType("text/vtt")
.setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
.setContentId(loadParams.subtitleUrl)
.setLanguage("en-US")
.build()
return MediaInfo.Builder(loadParams.videoUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType("videos/mp4")
.setMetadata(videoMetadata)
.setMediaTracks(listOf(subtitleTrack))
.build()
}
class LoadParams(val title: String,
val videoUrl: String,
val subtitleUrl: String?,
val playbackStartTime: Duration,
val autoPlay: Boolean)
override fun load(load: LoadParams) {
remoteMediaClient?.let { remoteMediaClient ->
val requestData = MediaLoadRequestData.Builder()
.setMediaInfo(buildMediaInfo(load))
.setAutoplay(true) // indicate to user when we're ready to play
.setCurrentTime(load.playbackStartTime.millis)
.build()
remoteMediaClient.load(requestData).setResultCallback { loadResult ->
if (loadResult.status.isSuccess) {
remoteMediaClient.setActiveMediaTracks(longArrayOf(SUBTITLE_TRACK_ID))
remoteMediaClient.setTextTrackStyle(getTextTrackStyle())
}
}
} ?: {
println("RemotePlayer loadInternal with remoteMediaClient=null. " +
"Will try again on cast state changed.")
pendingLoad = load
}()
}