Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Chromecast应用程序中重新连接活动时处理GoogleAppClient实例?_Android_Chromecast - Fatal编程技术网

Android 如何在Chromecast应用程序中重新连接活动时处理GoogleAppClient实例?

Android 如何在Chromecast应用程序中重新连接活动时处理GoogleAppClient实例?,android,chromecast,Android,Chromecast,我正在编写一个简单的应用程序,将公共照片从Dropbox公用文件夹发送到Chromecast 我决定编写自己的东西来更好地理解API,而不是CastCompanion库 根据谷歌指南: 如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未首先与Cast设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序再次启动时恢复与接收方的会话 在我看来,相同的解决方案应该适用于方向改变后的活动娱乐,因为它从头开始重新创建活动 我的第一个问题:我的假设正确吗?方向改变和系统终止这两

我正在编写一个简单的应用程序,将公共照片从Dropbox公用文件夹发送到Chromecast

我决定编写自己的东西来更好地理解API,而不是CastCompanion库

根据谷歌指南:

如果发送方应用程序与媒体路由断开连接,例如当用户或操作系统在用户未首先与Cast设备断开连接的情况下终止应用程序时,则应用程序必须在发送方应用程序再次启动时恢复与接收方的会话

在我看来,相同的解决方案应该适用于方向改变后的活动娱乐,因为它从头开始重新创建活动

我的第一个问题:我的假设正确吗?方向改变和系统终止这两种方案可能使用相同的解决方案

基于这个假设,我编写了一些代码来在活动恢复时恢复会话

我正在考虑方向更改场景,当活动从头开始重新创建时,我应该恢复路由Id、会话Id并尝试重新连接(我正在存储和检索共享首选项中的两个值)

我一直在用它测试,效果很好

这就是我所做的(基于谷歌发件人准则代码):

在发现正在进行的路由Id并找到cast设备后,我将此方法称为:

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,ApplicationStatusChanged上的
日志将为每部手机的旋转打印一个不同的实例。例如:如果我将手机旋转3次,日志会打印3次,并显示3个不同的指针地址。这使我相信它在内部保留了所有回调实例

既然活动正在重新创建,我需要创建另一个GoogleAppClient实例来保持会话,那么我应该如何处理这种情况

完整资料来源:


我认为,正确的方法(或至少更好的方法)是以下方法之一:

  • 如果您只有一个活动,而这正是您所关心的,那么请使用一个在配置更改中保持不变的片段,并将您想要无缝保持的内容放在那里。这样,手机的旋转就不会对演员相关的内容造成任何干扰

  • 如果您有多个活动,请考虑创建一个贯穿所有活动的对象,并将cast放在那里,然后在需要时向该对象请求CastApi实例,等等


在您的情况下,当您旋转手机时是否真的断开了连接?因为您正在建立一个全新的连接,所以当配置发生变化时,您可能需要先断开自己的连接(假设您不想使用我先前建议的(1)或(2))。

不,我不断开连接。读了你的答案,我现在明白了,我误解了“会话恢复”的内容。若活动被破坏,那个么断开连接是有意义的,因为一旦施法与活动生命周期相关联,用户希望停止施法。文档解决了进程终止时重新连接的需要。谢谢阿里!!关于第二种方法,我相信我可以使用前台服务做同样的事情,让用户知道应用程序已连接,即使活动被破坏也可以进行强制转换。看起来Netflix应用程序就是这样工作的。