适用于 Android 10 平台的 Vimeo 网络库崩溃 (api29)

问题描述

我使用 vimeo 网络库 (https://github.com/vimeo/vimeo-networking-java)、exoplayer 实现了 vimeo 网络,并在这篇文章中进行了解释 https://stackoverflow.com/a/65737556/8814924

现在的问题是当我检查 API 30 时出现错误

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.emergingit.emergingstudy/com.emergingit.emergingstudy.activities.course.ExoPlayerActivity}:java.lang.IllegalStateException:无法在 Android10Platform、sslSocketFactory 上提取信任管理器是类 com.android.org.conscrypt.OpenSSLSocketFactoryImpl

Caused by: java.lang.IllegalStateException: Unable to extract the trust manager on Android10Platform,sslSocketFactory is class com.android.org.conscrypt.OpenSSLSocketFactoryImpl

表示错误

VimeoClient.initialize(configuration);

这里讨论哪个问题:https://github.com/square/okhttp/issues/5878,问题讨论:

I assume you are calling the deprecated form of sslSocketFactory,which is broken on newer Android versions. https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/OkHttpClient.kt#L719

/**
 * Sets the socket factory used to secure HTTPS connections. If unset,the system default will
 * be used.
 *
 * @deprecated [SSLSocketFactory] does not expose its [X509TrustManager],which is a field that
 *     OkHttp needs to build a clean certificate chain. This method instead must use reflection
 *     to extract the trust manager. Applications should prefer to call
 *     `sslSocketFactory(SSLSocketFactory,X509TrustManager)`,which avoids such reflection.
 */
@Deprecated(
    message = "Use the sslSocketFactory overload that accepts a X509TrustManager.",level = DeprecationLevel.ERROR
)
fun sslSocketFactory(sslSocketFactory: SSLSocketFactory) = apply {
  if (sslSocketFactory != this.sslSocketFactoryOrNull) {
    this.routeDatabase = null
  }

  this.sslSocketFactoryOrNull = sslSocketFactory
  this.certificateChainCleaner = Platform.get().buildCertificateChainCleaner(sslSocketFactory)
}

为此使用网络库的当前版本“1.1.3”是否有任何可能的解决方案,或者我必须等到库更新?

解决方法

我主要使用 Vimeo-Networking 库 (v1.1.3) 在 Android 10 平台上解决了 Vimeo 视频流的问题。 因为主要问题是在 OkHttpClient 构建方法中

builder.sslSocketFactory(sSLSocketFactory);
//RetrofitClientBuilder.java#186    

其中 1 个参数版本已被弃用,我需要将 X509TTrustManager 作为第二个参数传递,如下所示:

builder.sslSocketFactory(sSLSocketFactory,new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates,String s) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates,String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        });

所以它解决了我的问题,直到此更新出现在此库的稳定版本中。我如何实现这一点如下所述:

  1. 错误显示在 VimeoClient.initialize(accessToken); 行,我搜索了该错误并发现它是由于此 OkHttpClient 方法弃用(带有 1 个参数)引起的。

  2. 所以我进入 VimeoClient.java 并看到它的构造函数 private Retrofit createRetrofit() 被调用,并且在它内部 private OkHttpClient createOkHttpClient() 被调用。并且创建了 public class RetrofitClientBuilder 对象,它有问题的方法是 public OkHttpClient build() 其中:if (sSLSocketFactory != null) { builder.sslSocketFactory(sSLSocketFactory); } 调用了这个已弃用的方法。

  3. 所以我只需要创建 2 个名为 VimeoClientUpdated.javaRetrofitClientBuilderUpdated.java 的新 java 文件,它只是 VimeoClient 的重命名副本.javaRetrofitClientBuilder.java 以及现在我的 RetrofitClientBuilderUpdated.java 没有弃用的方法,而是正确的方法,VimeoClientUpdated.java 正在调用RetrofitClientBuilderUpdated.java (由于最后一个类,我无法扩展,甚至无法将类包装到该解决方案的网关,我不得不面对无法在包装类中更改的私有方法)

  4. 最后不是调用 VimeoClient.initialize(accessToken),而是调用我新创建的 VimeoClientUpdated(accessToken),它在 Android 10 上播放 Vimeo 视频时不会崩溃。

建议我是否有更好的方法来满足我的目的(解决从 android 活动调用的已弃用的库方法)。 干杯……!!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...