diff --git a/app/build.gradle b/app/build.gradle index 1af425f..7013431 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.streamplayer" minSdk 21 targetSdk 35 - versionCode 100110 - versionName "10.1.10" + versionCode 100111 + versionName "10.1.11" buildConfigField "String", "DEVICE_REGISTRY_URL", '"http://194.163.191.200:4000"' } diff --git a/app/src/main/java/com/streamplayer/PlayerActivity.java b/app/src/main/java/com/streamplayer/PlayerActivity.java index ef47d0e..bc05e73 100644 --- a/app/src/main/java/com/streamplayer/PlayerActivity.java +++ b/app/src/main/java/com/streamplayer/PlayerActivity.java @@ -28,10 +28,15 @@ import androidx.media3.common.util.UnstableApi; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.dnsoverhttps.DnsOverHttps; @@ -254,11 +259,30 @@ public class PlayerActivity extends AppCompatActivity { } try { - OkHttpClient bootstrap = new OkHttpClient.Builder() + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) {} + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) {} + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + }; + + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + + OkHttpClient.Builder builder = new OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .retryOnConnectionFailure(true) - .build(); + .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) + .hostnameVerifier((hostname, session) -> true); + + OkHttpClient bootstrap = builder.build(); DnsOverHttps dohDns = new DnsOverHttps.Builder() .client(bootstrap) @@ -268,10 +292,8 @@ public class PlayerActivity extends AppCompatActivity { InetAddress.getByName("8.8.4.4")) .build(); - okHttpClient = bootstrap.newBuilder() - .dns(dohDns) - .build(); - } catch (UnknownHostException e) { + okHttpClient = builder.dns(dohDns).build(); + } catch (Exception e) { okHttpClient = new OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) diff --git a/app/src/main/java/com/streamplayer/StreamUrlResolver.java b/app/src/main/java/com/streamplayer/StreamUrlResolver.java index 32145de..26b7dfe 100644 --- a/app/src/main/java/com/streamplayer/StreamUrlResolver.java +++ b/app/src/main/java/com/streamplayer/StreamUrlResolver.java @@ -2,11 +2,15 @@ package com.streamplayer; import java.io.IOException; import java.net.InetAddress; -import java.net.UnknownHostException; +import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -28,14 +32,36 @@ public final class StreamUrlResolver { private static final OkHttpClient CLIENT; static { - OkHttpClient.Builder builder = new OkHttpClient.Builder() - .connectTimeout(15, TimeUnit.SECONDS) - .readTimeout(15, TimeUnit.SECONDS) - .followRedirects(true); - + OkHttpClient client = null; try { - // DNS de Google (8.8.8.8) - OkHttpClient bootstrap = new OkHttpClient.Builder().build(); + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) {} + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) {} + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + }; + + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .connectTimeout(15, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS) + .followRedirects(true) + .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) + .hostnameVerifier((hostname, session) -> true); + + OkHttpClient bootstrap = new OkHttpClient.Builder() + .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) + .hostnameVerifier((hostname, session) -> true) + .build(); + DnsOverHttps dns = new DnsOverHttps.Builder() .client(bootstrap) .url(HttpUrl.get("https://dns.google/dns-query")) @@ -44,11 +70,16 @@ public final class StreamUrlResolver { InetAddress.getByName("8.8.4.4")) .build(); builder.dns(dns); - } catch (UnknownHostException e) { - // Fallback a DNS del sistema + + client = builder.build(); + } catch (Exception e) { + client = new OkHttpClient.Builder() + .connectTimeout(15, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS) + .followRedirects(true) + .build(); } - - CLIENT = builder.build(); + CLIENT = client; } private StreamUrlResolver() { diff --git a/update-manifest.json b/update-manifest.json index af868ff..dc50d5a 100644 --- a/update-manifest.json +++ b/update-manifest.json @@ -1,10 +1,10 @@ { - "versionCode": 100300, - "versionName": "10.0.3", - "minSupportedVersionCode": 91000, + "versionCode": 100110, + "versionName": "10.1.10", + "minSupportedVersionCode": 0, "forceUpdate": false, - "downloadUrl": "https://gitea.cbcren.online/renato97/app/releases/download/v10.0.3/StreamPlayer-v10.0.3.apk", - "fileName": "StreamPlayer-v10.0.3.apk", - "sizeBytes": 0, - "notes": "StreamPlayer v10.0.3\n\nNovedades:\n- Fix: Evasión de bloqueos regionales mediante DNS de Google (DoH)\n- Corrección de error 'No se encontró la clave del stream'" -} \ No newline at end of file + "downloadUrl": "http://gitea.cbcren.online/renato97/app/releases/download/v10.1.10/StreamPlayer-v10.1.10-debug.apk", + "fileName": "StreamPlayer-v10.1.10-debug.apk", + "sizeBytes": 9113609, + "notes": "Cambiar a HTTP para evitar errores de certificado" +}