【发布时间】:2014-09-07 20:33:03
【问题描述】:
我正在编写一个简单的应用程序来将公共照片从 Dropbox 公共文件夹发送到 Chromecast。
我决定编写自己的东西来更好地理解 API,而不是 CastCompanion 库。
根据 Google 指南:
如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未先与 Cast 设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序时恢复与接收方的会话重新开始。
在我看来,相同的解决方案应该适用于在方向更改时重新创建 Activity,因为它从头开始重新创建 Activity。
我的第一个问题:我的假设是否正确?方向改变和系统终止这两种情况可能使用相同的解决方案吗?
鉴于这个假设,我编写了一些代码来在 Activity 恢复时恢复会话。
我正在考虑方向更改方案,当从头开始重新创建 Activity 并且我应该恢复路由 ID、会话 ID 并尝试重新连接(我正在存储和检索来自共享首选项的两个值)。
我一直在测试,它工作正常。
我就是这样做的(基于 Google Sender Guidelines 代码):
在发现正在进行的 Route Id 并找到投射设备后,我调用了这个方法:
private void connectToDevice(CastDevice castDevice) {
Log.d(TAG, "connecting to " + castDevice);
Cast.CastOptions.Builder apiOptionsBuilder = Cast.CastOptions
.builder(castDevice, new CastListener());
Log.d(TAG, "apiClient is null ? " + (apiClient == null));
apiClient = new GoogleApiClient.Builder(this)
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
Log.d(TAG, "apiClient connected? " + apiClient.isConnected());
Log.d(TAG, "apiClient connecting? " + apiClient.isConnecting());
apiClient.connect();
}
private class CastListener extends Cast.Listener {
@Override
public void onApplicationStatusChanged() {
if (apiClient != null) {
Log.d(TAG, "callback => " + this);
}
}
@Override
public void onVolumeChanged() {
}
@Override
public void onApplicationDisconnected(int errorCode) {
teardown();
}
}
在这个方法之后,如果我识别出重新连接,我会调用Cast.CastApi.joinApplication。
但是一旦重新连接到 Chromecast,onApplicationStatusChanged 的日志就会为每部手机的旋转打印一个不同的实例。例如:如果我将手机旋转 3 次,则日志会使用 3 个不同的指针地址打印 3 次。这让我相信它在内部持有所有回调实例。
由于正在重新创建 Activity 并且我需要创建另一个 GoogleApiClient 实例来保持会话,我应该如何处理这种情况?
完整来源:
【问题讨论】:
标签: android chromecast