Примеры интеграции Android SDK
Этот раздел демонстрирует примеры интеграции Teleport SDK с популярными Android-плеерами: ExoPlayer и Media3.
1. Пример интеграции с ExoPlayer
Интеграция с ExoPlayer включает в себя создание TeleportDataSourceFactory и передачу его в ExoPlayer.Builder.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
import com.google.android.exoplayer2.ui.PlayerView
import com.teleport.TeleportApi
import com.teleport.TeleportConfiguration
import com.teleport.exoplayer.TeleportDataSourceFactory // Импорт для ExoPlayer
class MainActivity : AppCompatActivity() {
private var exoPlayer: ExoPlayer? = null
private var teleportApi: TeleportApi? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 1. Создаем конфигурацию Teleport с вашим API_KEY
val teleportConfiguration = TeleportConfiguration.Builder("YOUR_API_KEY") // Замените на ваш API_KEY
.build()
// 2. Инициализируем TeleportApi
val teleportApi = TeleportApi(this, teleportConfiguration)
.also { this.teleportApi = it }
// 3. Создаем фабрику для DataSource, которая будет взаимодействовать с Teleport
val dataSourceFactory = TeleportDataSourceFactory(teleportApi)
// 4. Создаем MediaSourceFactory, используя нашу TeleportDataSourceFactory
val mediaSourceFactory = DefaultMediaSourceFactory(this)
.setDataSourceFactory(dataSourceFactory)
// 5. Создаем ExoPlayer, передавая ему нашу MediaSourceFactory
val exoPlayer = ExoPlayer.Builder(this)
.setMediaSourceFactory(mediaSourceFactory)
.build()
.also { this.exoPlayer = it }
// 6. Добавляем слушатель для отслеживания событий плеера (например, буферизации)
exoPlayer.addListener(object : Player.Listener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_BUFFERING) {
teleportApi.buffering() // Сообщаем Teleport о буферизации
}
}
})
// 7. Привязываем плеер к PlayerView и устанавливаем медиа-элемент
val playerView = findViewById<PlayerView>(R.id.playerView)
playerView.player = exoPlayer
val item = MediaItem.fromUri("YOUR_STREAM_URL") // Замените на URL вашего видеопотока
exoPlayer.setMediaItem(item)
}
override fun onResume() {
super.onResume()
exoPlayer?.play() // Возобновляем воспроизведение при возобновлении активности
}
override fun onPause() {
super.onPause()
exoPlayer?.pause() // Приостанавливаем воспроизведение при паузе активности
}
override fun onDestroy() {
super.onDestroy()
exoPlayer?.release() // Освобождаем ресурсы ExoPlayer
exoPlayer = null
// Важно: Высвобождаем ресурсы TeleportApi после высвобождения ресурсов плеера
teleportApi?.release()
teleportApi = null
}
}Важно
Не забудьте заменить "YOUR_API_KEY" на ваш реальный API-ключ из кабинета Teleport и "YOUR_STREAM_URL" на URL вашего видеопотока.
2. Пример интеграции с Media3
Интеграция с Media3 очень похожа на интеграцию с ExoPlayer, поскольку Media3 является следующим поколением библиотек для медиа в Android, построенным на базе ExoPlayer. Основное отличие заключается в использовании соответствующих пакетов Media3.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.media3.exoplayer.ExoPlayer // Изменено на Media3
import androidx.media3.common.MediaItem // Изменено на Media3
import androidx.media3.common.Player // Изменено на Media3
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory // Изменено на Media3
import androidx.media3.ui.PlayerView // Изменено на Media3
import com.teleport.TeleportApi
import com.teleport.TeleportConfiguration
import com.teleport.media3.TeleportDataSourceFactory // Изменено на Media3
class MainActivity : AppCompatActivity() {
private var exoPlayer: ExoPlayer? = null // Тип остается ExoPlayer
private var teleportApi: TeleportApi? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val teleportConfiguration = TeleportConfiguration.Builder("YOUR_API_KEY").build()
val teleportApi = TeleportApi(this, teleportConfiguration)
.also { this.teleportApi = it }
val dataSourceFactory = TeleportDataSourceFactory(teleportApi)
val mediaSourceFactory = DefaultMediaSourceFactory(this)
.setDataSourceFactory(dataSourceFactory)
val exoPlayer = ExoPlayer.Builder(this)
.setMediaSourceFactory(mediaSourceFactory)
.build()
.also { this.exoPlayer = it }
exoPlayer.addListener(object : Player.Listener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_BUFFERING) {
teleportApi.buffering()
}
}
})
val playerView = findViewById<PlayerView>(R.id.playerView)
playerView.player = exoPlayer
val item = MediaItem.fromUri("YOUR_STREAM_URL")
exoPlayer.setMediaItem(item)
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
}
override fun onPause() {
super.onPause()
exoPlayer?.pause()
}
override fun onDestroy() {
super.onDestroy()
exoPlayer?.release()
exoPlayer = null
teleportApi?.release()
teleportApi = null
}
}Примечание
Основное отличие при интеграции с Media3 заключается в использовании классов из пакетов androidx.media3.* вместо com.google.android.exoplayer2.* и использовании com.teleport.media3.TeleportDataSourceFactory. Логика инициализации и взаимодействия остается практически идентичной.