diff --git a/app/build.gradle b/app/build.gradle index bab41cd..daa54da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,14 +2,14 @@ apply plugin: 'com.android.application' android { namespace "com.streamplayer" - compileSdk 33 + compileSdk 35 defaultConfig { applicationId "com.streamplayer" minSdk 21 - targetSdk 33 - versionCode 100700 - versionName "10.0.7" + targetSdk 35 + versionCode 100100 + versionName "10.1.0" buildConfigField "String", "DEVICE_REGISTRY_URL", '"http://194.163.191.200:4000"' } @@ -48,9 +48,15 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.recyclerview:recyclerview:1.3.2' - // 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' + // 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' diff --git a/app/src/main/java/com/streamplayer/PlayerActivity.java b/app/src/main/java/com/streamplayer/PlayerActivity.java index 4dd808c..5d1480d 100644 --- a/app/src/main/java/com/streamplayer/PlayerActivity.java +++ b/app/src/main/java/com/streamplayer/PlayerActivity.java @@ -11,17 +11,19 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; -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; +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; import java.io.IOException; import java.net.InetAddress; @@ -34,6 +36,7 @@ import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.dnsoverhttps.DnsOverHttps; +@OptIn(markerClass = UnstableApi.class) public class PlayerActivity extends AppCompatActivity { public static final String EXTRA_CHANNEL_NAME = "extra_channel_name"; diff --git a/app/src/main/res/layout/activity_player.xml b/app/src/main/res/layout/activity_player.xml index 1dc7f3f..c209d18 100644 --- a/app/src/main/res/layout/activity_player.xml +++ b/app/src/main/res/layout/activity_player.xml @@ -7,7 +7,7 @@ android:background="@color/black" tools:context=".PlayerActivity"> - 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 +