【发布时间】:2014-11-03 00:24:31
【问题描述】:
我正在开发一款已经上市一段时间的 Chromecast 应用。我们开始收到报告说人们在启动后第一次尝试无法连接到 Chromecast。直到最近我们才能重现这种情况(而且只有一台设备恰好表现出这种行为)
Chromecast 图标显示它已连接,但应用程序从未启动。最终,Chromecast 图标显示它已断开连接。我从这个设备上抓了一个 logcat。
D/CastSocket( 1037): [MiniDeviceController-1] onWritable when state is 1
D/CastSocket( 1037): [MiniDeviceController-1] SSLException encountered. Tearing down the socket.
D/CastSocket( 1037): javax.net.ssl.SSLException: Error occured in delegated task:javax.net.ssl.SSLException: Not trusted server certificate
D/CastSocket( 1037): at com.android.org.conscrypt.HandshakeProtocol.fatalAlert(HandshakeProtocol.java:316)
D/CastSocket( 1037): at com.android.org.conscrypt.HandshakeProtocol.wrap(HandshakeProtocol.java:268)
D/CastSocket( 1037): at com.android.org.conscrypt.SSLEngineImpl.wrap(SSLEngineImpl.java:693)
D/CastSocket( 1037): at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:438)
D/CastSocket( 1037): at beb.k(SourceFile:671)
D/CastSocket( 1037): at bef.run(SourceFile:96)
D/CastSocket( 1037): at java.lang.Thread.run(Thread.java:841)
D/CastSocket( 1037): Caused by: com.android.org.conscrypt.AlertException: javax.net.ssl.SSLException: Not trusted server certificate
D/CastSocket( 1037): at com.android.org.conscrypt.HandshakeProtocol.fatalAlert(HandshakeProtocol.java:316)
D/CastSocket( 1037): at com.android.org.conscrypt.ClientHandshakeImpl.verifyServerCert(ClientHandshakeImpl.java:559)
D/CastSocket( 1037): at com.android.org.conscrypt.ClientHandshakeImpl.processServerHelloDone(ClientHandshakeImpl.java:373)
D/CastSocket( 1037): at com.android.org.conscrypt.ClientHandshakeImpl$1.run(ClientHandshakeImpl.java:283)
D/CastSocket( 1037): at com.android.org.conscrypt.DelegatedTask.run(DelegatedTask.java:36)
D/CastSocket( 1037): at beb.a(SourceFile:721)
D/CastSocket( 1037): at beb.j(SourceFile:635)
D/CastSocket( 1037): ... 2 more
D/CastSocket( 1037): Caused by: javax.net.ssl.SSLException: Not trusted server certificate
D/CastSocket( 1037): ... 9 more
D/CastSocket( 1037): Caused by: java.security.cert.CertificateNotYetValidException
D/CastSocket( 1037): at com.android.org.conscrypt.OpenSSLX509Certificate.checkValidity(OpenSSLX509Certificate.java:216)
D/CastSocket( 1037): at com.android.org.conscrypt.OpenSSLX509Certificate.checkValidity(OpenSSLX509Certificate.java:209)
D/CastSocket( 1037): at bdu.checkServerTrusted(SourceFile:47)
D/CastSocket( 1037): at com.android.org.conscrypt.ClientHandshakeImpl.verifyServerCert(ClientHandshakeImpl.java:556)
D/CastSocket( 1037): ... 7 more
D/CastSocketMultiplexer( 1037): *** removing socket CastSocket:MiniDeviceController-1 (onWritable)
D/CastSocket( 1037): [MiniDeviceController-1] doTeardown with reason=4
D/DeviceFilter( 1037): DEACTIVATE MiniDeviceController-1; finished=false
D/DeviceFilter( 1037): socket is disconnected
D/CastMediaRouteProvider( 1037): onDeviceFilterError for 516b4a3a710d7bdfe8dc75ff4c4901a0: connection failed: error=4
这似乎都在 Google Play 服务的 Chromecast API 中。我们使用 Amazon S3 来托管和使用他们的 SSL 证书。奇怪的是,在这个初始错误之后,设备确实连接了。我一直无法将我的大脑包裹在这个问题上。我们的应用仅适用于 Android 设备,并非所有设备都会出现这种行为。
【问题讨论】:
-
你能捕捉到异常并重试吗?第二个请求应该是好的
-
调用connect时,是否收到onConnected()回调?应该不需要在应用程序中捕获异常并重试。
-
我需要追踪出现错误的设备并调试我是否收到了 onConnected() 回调。我会在测试后更新。
-
请记住,在您收到 onConnected 之前,您不应尝试启动您的应用
-
在收到 onConnected 回调之前,我们不会尝试启动应用程序。
标签: android chromecast google-cast