Files
furbo-vpn-edition/todo.md
renato97 dc5f6484b2 Migración de ExoPlayer 2.x a Media3 1.5.0 (v10.1.0)
## Cambios realizados
- Migración completa de ExoPlayer 2.x a AndroidX Media3 1.5.0
- Actualización de dependencias: media3-exoplayer, media3-ui, media3-session, etc.
- Actualización de imports en PlayerActivity.java
- Actualización del namespace de PlayerView en activity_player.xml
- Incremento de versionCode a 100100 y versionName a 10.1.0
- Actualización de compileSdk y targetSdk a 35 para compatibilidad
- Soporte mejorado para Android TV/Leanback
- Preparación para MediaSession integrado

## Testing
- Compilación exitosa sin errores
- APK generado: StreamPlayer-v10.1.0-Media3-debug.apk

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-26 22:54:10 +01:00

9.8 KiB

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):

// 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:

// 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):

versionCode 100100
versionName "10.1.0"

1.3 Actualizar compileSdk (opcional pero recomendado)

CAMBIAR (linea 5):

compileSdk 34

CAMBIAR (linea 10):

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):

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:

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:

@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:

private MediaSource buildMediaSource(MediaItem mediaItem) {
    Map<String, String> 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):

<com.google.android.exoplayer2.ui.PlayerView

POR:

<androidx.media3.ui.PlayerView

El resto de atributos (app:resize_mode, app:use_controller) siguen funcionando igual.


PASO 4: Sincronizar y Compilar

4.1 Sync Gradle

Ejecutar:

./gradlew --refresh-dependencies

4.2 Limpiar y compilar

./gradlew clean assembleDebug

4.3 Verificar errores

Si hay errores de compilacion, revisar:

  1. Que todos los imports esten actualizados
  2. Que la anotacion @OptIn este presente
  3. Que el namespace en XML este correcto

PASO 5: Testing

5.1 Probar en Android TV

  • Instalar APK en dispositivo Android TV
  • Verificar que los canales cargan correctamente
  • Verificar que la calidad se mantiene en maxima
  • Verificar navegacion con D-pad

5.2 Verificar funcionalidades

  • Reproduccion de streams HLS
  • Overlay de controles
  • Boton "Elegir otro"
  • Manejo de errores
  • Reconexion tras perdida de conexion

PASO 6: Commit y Release

6.1 Copiar APK

cp app/build/outputs/apk/debug/app-debug.apk ./StreamPlayer-v10.1.0-debug.apk

6.2 Commit

git add -A
git commit -m "Migracion de ExoPlayer 2.x a Media3 1.5.0 (v10.1.0)"
git tag v10.1.0
git push origin main
git push origin v10.1.0

6.3 Crear release en Gitea

curl -s -u renato97:wlillidan1 -X POST \
  "https://gitea.cbcren.online/api/v1/repos/renato97/app/releases" \
  -H "Content-Type: application/json" \
  -d '{
    "tag_name": "v10.1.0",
    "name": "StreamPlayer v10.1.0 - Media3",
    "body": "## Cambios\n- Migracion completa de ExoPlayer 2.x a AndroidX Media3 1.5.0\n- Mejor soporte para Android TV\n- Actualizaciones de seguridad y rendimiento",
    "prerelease": false
  }'

6.4 Subir APK

# Reemplazar {RELEASE_ID} con el ID devuelto
curl -s -u renato97:wlillidan1 -X POST \
  "https://gitea.cbcren.online/api/v1/repos/renato97/app/releases/{RELEASE_ID}/assets?name=StreamPlayer-v10.1.0.apk" \
  --data-binary @./StreamPlayer-v10.1.0-debug.apk \
  -H "Content-Type: application/vnd.android.package-archive"

Tabla de Mapeo de Imports

ExoPlayer 2.x Media3
com.google.android.exoplayer2.ExoPlayer androidx.media3.exoplayer.ExoPlayer
com.google.android.exoplayer2.MediaItem androidx.media3.common.MediaItem
com.google.android.exoplayer2.Player androidx.media3.common.Player
com.google.android.exoplayer2.PlaybackException androidx.media3.common.PlaybackException
com.google.android.exoplayer2.DefaultRenderersFactory androidx.media3.exoplayer.DefaultRenderersFactory
com.google.android.exoplayer2.trackselection.DefaultTrackSelector androidx.media3.exoplayer.trackselection.DefaultTrackSelector
com.google.android.exoplayer2.source.MediaSource androidx.media3.exoplayer.source.MediaSource
com.google.android.exoplayer2.source.hls.HlsMediaSource androidx.media3.exoplayer.hls.HlsMediaSource
com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource androidx.media3.datasource.okhttp.OkHttpDataSource
com.google.android.exoplayer2.ui.PlayerView androidx.media3.ui.PlayerView
com.google.android.exoplayer2.util.Util androidx.media3.common.util.Util

Notas Importantes

  1. @OptIn es obligatorio: Media3 marca algunas APIs como @UnstableApi. Agregar @OptIn(markerClass = UnstableApi.class) a la clase o metodos que usen estas APIs.

  2. No hay cambios en la logica: La API de Media3 es casi identica a ExoPlayer 2.x. Solo cambian los packages.

  3. Leanback UI: Agregamos media3-ui-leanback para futuras mejoras de Android TV, aunque por ahora usamos el PlayerView standard.

  4. MediaSession: Agregamos media3-session para integracion con controles del sistema (play/pause desde el launcher de Android TV). Esto se puede implementar despues.

  5. Compatibilidad: Media3 1.5.0 requiere minSdk 21 (igual que antes), no hay cambios de compatibilidad.


Errores Comunes y Soluciones

Error: "Cannot find symbol: class PlayerView"

Causa: El import o el XML tienen el namespace incorrecto. Solucion: Verificar que sea androidx.media3.ui.PlayerView en Java y XML.

Error: "This declaration is opt-in"

Causa: Falta la anotacion @OptIn. Solucion: Agregar @OptIn(markerClass = UnstableApi.class) antes de la clase.

Error: "Cannot resolve symbol 'HlsMediaSource'"

Causa: Falta la dependencia media3-exoplayer-hls. Solucion: Verificar que implementation 'androidx.media3:media3-exoplayer-hls:1.5.0' este en build.gradle.

Error: "Cannot resolve symbol 'OkHttpDataSource'"

Causa: Falta la dependencia media3-datasource-okhttp. Solucion: Verificar que implementation 'androidx.media3:media3-datasource-okhttp:1.5.0' este en build.gradle.


Checklist Final

  • build.gradle: Dependencias actualizadas a Media3 1.5.0
  • build.gradle: Version actualizada a 10.1.0
  • PlayerActivity.java: Imports actualizados
  • PlayerActivity.java: @OptIn agregado
  • activity_player.xml: PlayerView namespace actualizado
  • Compilacion exitosa sin errores
  • Testing en dispositivo Android TV
  • Commit y push realizados
  • Release creado en Gitea
  • APK subido al release