Android Chromecast: почему фон субтитров = ПРОЗРАЧНЫЙ приводит к черному фону? - PullRequest
0 голосов
/ 12 марта 2020

Я добавляю поддержку 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
  }()
}
...