问题描述
我使用 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];
}
});
所以它解决了我的问题,直到此更新出现在此库的稳定版本中。我如何实现这一点如下所述:
-
错误显示在 VimeoClient.initialize(accessToken); 行,我搜索了该错误并发现它是由于此 OkHttpClient 方法弃用(带有 1 个参数)引起的。
-
所以我进入 VimeoClient.java 并看到它的构造函数 private Retrofit createRetrofit() 被调用,并且在它内部 private OkHttpClient createOkHttpClient() 被调用。并且创建了 public class RetrofitClientBuilder 对象,它有问题的方法是 public OkHttpClient build() 其中:
if (sSLSocketFactory != null) { builder.sslSocketFactory(sSLSocketFactory); }
调用了这个已弃用的方法。 -
所以我只需要创建 2 个名为 VimeoClientUpdated.java 和 RetrofitClientBuilderUpdated.java 的新 java 文件,它只是 VimeoClient 的重命名副本.java 和 RetrofitClientBuilder.java 以及现在我的 RetrofitClientBuilderUpdated.java 没有弃用的方法,而是正确的方法,VimeoClientUpdated.java 正在调用RetrofitClientBuilderUpdated.java (由于最后一个类,我无法扩展,甚至无法将类包装到该解决方案的网关,我不得不面对无法在包装类中更改的私有方法)
-
最后不是调用
VimeoClient.initialize(accessToken)
,而是调用我新创建的VimeoClientUpdated(accessToken)
,它在 Android 10 上播放 Vimeo 视频时不会崩溃。
建议我是否有更好的方法来满足我的目的(解决从 android 活动调用的已弃用的库方法)。 干杯……!!