# Migracion de ExoPlayer 2.x a Media3 ## Objetivo Migrar StreamPlayer de ExoPlayer 2.18.7 a AndroidX Media3 1.5.0 para obtener: - Soporte activo y actualizaciones de seguridad - Mejor integracion con Android TV/Leanback - MediaSession integrado para controles del sistema ## Version objetivo - **Media3**: 1.5.0 - **Nueva version app**: 10.1.0 (versionCode: 100100) --- # PASO 1: Actualizar build.gradle ## Archivo: `app/build.gradle` ### 1.1 Cambiar dependencias **ELIMINAR estas lineas (51-55):** ```gradle // ExoPlayer para reproducción de video implementation 'com.google.android.exoplayer:exoplayer:2.18.7' implementation 'com.google.android.exoplayer:extension-okhttp:2.18.7' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.12.0' ``` **AGREGAR estas lineas en su lugar:** ```gradle // Media3 para reproduccion de video (Android TV optimizado) implementation 'androidx.media3:media3-exoplayer:1.5.0' implementation 'androidx.media3:media3-exoplayer-hls:1.5.0' implementation 'androidx.media3:media3-datasource-okhttp:1.5.0' implementation 'androidx.media3:media3-ui:1.5.0' implementation 'androidx.media3:media3-ui-leanback:1.5.0' implementation 'androidx.media3:media3-session:1.5.0' // OkHttp con DNS over HTTPS implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.12.0' ``` ### 1.2 Actualizar version **CAMBIAR (lineas 11-12):** ```gradle versionCode 100100 versionName "10.1.0" ``` ### 1.3 Actualizar compileSdk (opcional pero recomendado) **CAMBIAR (linea 5):** ```gradle compileSdk 34 ``` **CAMBIAR (linea 10):** ```gradle targetSdk 34 ``` --- # PASO 2: Actualizar PlayerActivity.java ## Archivo: `app/src/main/java/com/streamplayer/PlayerActivity.java` ### 2.1 Cambiar TODOS los imports **ELIMINAR estos imports (lineas 14-24):** ```java import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.util.Util; ``` **AGREGAR estos imports en su lugar:** ```java import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.common.MediaItem; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; import androidx.media3.exoplayer.DefaultRenderersFactory; import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; import androidx.media3.datasource.okhttp.OkHttpDataSource; import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.hls.HlsMediaSource; import androidx.media3.ui.PlayerView; import androidx.media3.common.util.Util; import androidx.annotation.OptIn; import androidx.media3.common.util.UnstableApi; ``` ### 2.2 Agregar anotacion @OptIn a la clase **ANTES de la declaracion de clase (linea 37), AGREGAR:** ```java @OptIn(markerClass = UnstableApi.class) public class PlayerActivity extends AppCompatActivity { ``` Esto es necesario porque algunas APIs de Media3 estan marcadas como "unstable" pero son perfectamente funcionales. ### 2.3 Cambiar metodo buildMediaSource **El metodo buildMediaSource (lineas 188-200) debe quedar asi:** ```java private MediaSource buildMediaSource(MediaItem mediaItem) { Map headers = new HashMap<>(); headers.put("Referer", channelUrl); headers.put("Origin", "https://streamtpcloud.com"); headers.put("Accept", "*/*"); headers.put("Connection", "keep-alive"); String userAgent = Util.getUserAgent(this, "StreamPlayer"); OkHttpDataSource.Factory factory = new OkHttpDataSource.Factory(provideOkHttpClient()) .setUserAgent(userAgent) .setDefaultRequestProperties(headers); return new HlsMediaSource.Factory(factory).createMediaSource(mediaItem); } ``` **NOTA**: El codigo es casi identico, solo cambian los imports. Verificar que compile. ### 2.4 Verificar compatibilidad de DefaultTrackSelector El metodo `setForceHighestSupportedBitrate(true)` sigue existiendo en Media3, no requiere cambios. --- # PASO 3: Actualizar activity_player.xml ## Archivo: `app/src/main/res/layout/activity_player.xml` ### 3.1 Cambiar el namespace del PlayerView **CAMBIAR (linea 10):** ```xml