Chromecast Android 发送方连接到接收方时的 NPE

Posted

技术标签:

【中文标题】Chromecast Android 发送方连接到接收方时的 NPE【英文标题】:NPE when Chromecast Android sender connects to receiver 【发布时间】:2014-02-16 20:12:42 【问题描述】:

在我的 android sender 应用中,选择 Chromecast 接收器后,当应用执行 apiClient.connect() 时,logcat 显示以下针对 NullPointerException 的堆栈跟踪:

02-16 13:55:10.130: E/AndroidRuntime(7780): FATAL EXCEPTION: main
02-16 13:55:10.130: E/AndroidRuntime(7780): java.lang.NullPointerException
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.google.android.gms.internal.dg.a(Unknown Source)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.google.android.gms.internal.dw.w(Unknown Source)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.google.android.gms.internal.dw$f.onServiceConnected(Unknown Source)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.google.android.gms.internal.dy$a$a.onServiceConnected(Unknown Source)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1202)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1219)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.os.Handler.handleCallback(Handler.java:725)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.os.Looper.loop(Looper.java:158)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at android.app.ActivityThread.main(ActivityThread.java:5751)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at java.lang.reflect.Method.invokeNative(Native Method)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at java.lang.reflect.Method.invoke(Method.java:511)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
02-16 13:55:10.130: E/AndroidRuntime(7780):     at dalvik.system.NativeStart.main(Native Method)

我相信我已经正确设置了 apiClient,因为我实际上是从 HelloWorld 示例中复制了它的代码。

这是调用 apiClient.connect 的代码。 Receiver 类只是一个 POJO,它在应用程序中传递东西。 listeners 是一个内部类的实例,它扩展并实现了所有需要的监听器。

public void launch(Receiver receiver, Activity activity) 
    String receiverName = null;
    if (receiver != null) 
        receiverName = receiver.name;
    
    Log.d(TAG, "::launch(" + receiverName + ")");
    try 
        unlaunch();
        launchedReceiver = receiver;
        castDevice = launchedReceiver.castDevice;
        Builder optionsBuilder = Cast.CastOptions.builder(castDevice,
                                                          listeners);
        CastOptions options = optionsBuilder.build();
        GoogleApiClient.Builder apiBuilder = new GoogleApiClient.Builder(activity);
        apiBuilder.addApi(Cast.API, options)
                  .addConnectionCallbacks(listeners)
                  .addOnConnectionFailedListener(listeners);
        apiClient = apiBuilder.build();
        apiClient.connect();
     catch (Exception e) 
        Log.e(TAG, "exception launching receiver", e);
    


public void unlaunch() 
    String receiverName = null;
    if (launchedReceiver != null) 
        receiverName = launchedReceiver.name;
    
    Log.d(TAG, "::launch(" + receiverName + ")");

到目前为止,从堆栈跟踪中搜索各种短语并没有发现任何有用的信息。

任何机构对此有想法?我已经花了几个小时尝试了一些东西,但到目前为止还没有运气。我将继续进行实验,但我可以使用一两个指针来确定该去哪里。

【问题讨论】:

你能添加更多的日志,还是你有例外?另外,请发布您的发件人,以便我们了解流程。 这就是异常日志中的内容。它发生在应用程序调用 apiClient.connect() 之后的一两秒,并且在 NPE 堆栈跟踪之前,日志中只有通常的背景噪音。 当我尝试发布调用 apiCLient.connect() 的代码时,堆栈溢出说它太大了。如何发布代码,大约 25 行? 请显示您的发件人,您可以更新您的原始帖子以便有空间添加发件人代码 我已经编辑了原始帖子以显示调用 apiClient.connect() 的代码。 【参考方案1】:

我有同样的问题 - 再次与 Google Play 服务 4.2 相关。我的应用确实使用了 Chromecast,但在我的情况下,这个崩溃发生在应用启动时(甚至没有尝试连接到 Chromecast 设备)。

虽然我没有在我的测试设备上看到此问题,但当用户从我的应用程序的旧版本(未使用 Google Play 服务)升级到新版本(用于 Chromecast 支持)时,首次出现此问题。这发生在 2 个不同设备(手机和平板电脑)上的同一用户身上。在这两种情况下,他都可以通过卸载并重新安装应用程序来恢复。这可能已经清除了应用设置/缓存等中的某些内容,使其正常工作。

下面是我的异常处理捕获的堆栈跟踪(异常与原始问题中的完全相同):

[ java.lang.NullPointerException ] nulljava.lang.NullPointerException
    at com.google.android.gms.internal.dg.a(Unknown Source)
    at com.google.android.gms.internal.dw.w(Unknown Source)
    at com.google.android.gms.internal.dw$f.onServiceConnected(Unknown Source)
    at com.google.android.gms.internal.dy$a$a.onServiceConnected(Unknown Source)
    at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1097)
    at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1114)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4962)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
    at dalvik.system.NativeStart.main(Native Method)

【讨论】:

没有足够的信息来了解这是如何发生的 根据源代码,似乎发生这种情况的唯一方法是,如果您选择的设备不是真正的铸造设备。你能验证一下吗? 是的,就是这样(有点)。事实证明,这个问题(至少在我的情况下)与构建媒体路由选择器有关。我有:builder.addControlCategory(CastMediaControlIntent.categoryForCast(AppId())); builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO); 澄清一下 - 当时没有尝试连接到任何投射设备。似乎在与用于显示 MediaRouteButton 的 UI 相关的代码路径中内部使用了“坏”的 MediaRouteSelector(可能是由 Play 服务?)。删除builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO) 解决了这个问题。

以上是关于Chromecast Android 发送方连接到接收方时的 NPE的主要内容,如果未能解决你的问题,请参考以下文章

Chromecast 发件人应用程序未连接到 Android Receiver 应用程序,始终连接到 Web 接收器

使用 chrome 将多台笔记本电脑连接到 chromecast

在android中重新启动应用程序时如何重新连接chromecast设备

可以将 HLS (http) 从 Android 应用程序发送到 Chromecast?

从 iOS 应用程序向 Chromecast 发送本地图像时出现问题

如何将 Android 发件人的 IP 地址获取到 Chromecast 设备?