使用适用于 Android 移动应用程序的 Anymote 库与 Android TV 通信

Posted

技术标签:

【中文标题】使用适用于 Android 移动应用程序的 Anymote 库与 Android TV 通信【英文标题】:Using the Anymote library for an Android mobile application to communicate with Android TV 【发布时间】:2016-07-25 10:55:53 【问题描述】:

一般用例:

对于我的项目,我正在尝试实现几个简单的游戏,例如 Pong 或 android TV 的简单测验。电视分别是 Android 电视盒显示游戏和处理逻辑(单独的模块)。智能手机和平板电脑应充当这些游戏的简单控制器(单独的模块)。例如:玩 Pong 时,手机上的应用程序只显示 2 个箭头,用于向上或向下移动玩家的球拍。对于电视上的应用程序和移动设备上的应用程序之间的连接和通信,使用了 Google Nearby Connections API

实际问题:

现在的要求是用户可以通过手机启动 Pong 游戏。这意味着:他在移动设备上打开简单的控制器应用程序,选择一个化名,然后决定是要开始新的 Pong 游戏还是要加入现有的 Pong 游戏。这样当用户想要开始乒乓球游戏时,他应该能够按下屏幕上的按钮,Android TV 上的应用程序就会启动(如果尚未运行)。

我对此进行了大量研究,遗憾地发现没有太多示例或源代码可用于此类功能。幸运的是,我找到了官方 Google TV Remote 应用程序的源代码(由于我的声誉太低,我无法添加链接)。

我知道这是一款适用于旧版 Google TV 而不是 Android TV 的应用。但是在查看它时,我发现 AnymoteLibrary 正好提供了我想要的那种功能。我从这里下载的:https://github.com/google/googletv-android-samples

我现在被屏蔽的地方:

所以,我从上面的链接中取出 AnymoteLibrary,并将其作为单独的模块导入到我在 Android Studio 中的现有项目中。经过一些导入修复和 Gradle 清理后,我认为它可能会起作用。我修改了 build.gradle 文件,如下所示:

apply plugin: 'com.android.library'

dependencies 
    //compile 'com.google.protobuf:protobuf-java:2.6.1'
    compile files('libs/anymote.jar')
    compile files('libs/bcprov-jdk15-143.jar')
    compile files('libs/polo.jar')
    compile files('libs/protobuf-java-2.2.0-lite.jar')


android 
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

defaultConfig 
    minSdkVersion 17
    targetSdkVersion 23


buildTypes 
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),   'proguard-rules.txt'
    


packagingOptions 
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'

并从 googletv-android-samples/BlackJackTVRemote/src/com/example/google/tv/remote/blackjack/ 目录中添加和调整 BlackJackRemoteActivity.java从上面的链接到我在移动模块上的用例。有了这个,我只是想测试我是否可以从我的应用程序中控制 Android TV,所以我尝试运行它。起初应用程序启动并且它似乎可以工作(请参阅以下日志消息),但随后出现异常:

E/KeyStoreUtil: Key store missing identity for anymote-remote
V/KeyStoreUtil: Generating key pair ...
V/KeyStoreUtil: Generating certificate ...
E/dalvikvm: Could not find class      'org.bouncycastle.jce.provider.BouncyCastleProvider', referenced from  method com.google.polo.ssl.SslUtil.generateX509V1Certificate
W/dalvikvm: VFY: unable to resolve new-instance 9479      (Lorg/bouncycastle/jce/provider/BouncyCastleProvider;) in   Lcom/google/polo/ssl/SslUtil;
E/dalvikvm: Could not find class   'org.bouncycastle.jce.provider.BouncyCastleProvider', referenced from  method com.google.polo.ssl.SslUtil.generateX509V3Certificate
W/dalvikvm: VFY: unable to resolve new-instance 9479   (Lorg/bouncycastle/jce/provider/BouncyCastleProvider;) in   Lcom/google/polo/ssl/SslUtil;
W/dalvikvm: threadid=1: thread exiting with uncaught exception   (group=0x416a0e18)

最后的异常信息:

E/AndroidRuntime: 致命异常: main 进程:androidtvportablecontroller,PID:23592 java.lang.NoClassDefFoundError:org.bouncycastle.jce.provider.BouncyCastleProvider 在 com.google.polo.ssl.SslUtil.generateX509V3Certificate(SslUtil.java:118) 在 com.google.polo.ssl.SslUtil.generateX509V3Certificate(SslUtil.java:165) 在 com.example.google.tv.anymotelibrary.connection.KeyStoreManager.generateAppCertificate(KeyStoreManager.java:154)

我完全不知道 BouncyCastleProvider 来自哪里以及如何调整我的代码来修复这个异常。

同样,我什至不确定我是否没有浪费时间使用 Google TV 时代的旧代码来获得手机和电视应用之间所需的功能。

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

BouncyCastleProvider 用于安全连接。默认情况下,它可能不包含在 Android 中。您可以通过 jar 或 gradle 链接找到它。

您可能还想访问这个答案,Is there a smaller version of the BouncyCastleProvider on android?,它使用与 Android 兼容的类似库。

【讨论】:

BouncyCastleProvider 的 .jar 文件位于我的 lib 目录中。我还尝试了一个较小的版本(如您的链接中所建议的那样)。可悲的是,仍然是同样的问题。

以上是关于使用适用于 Android 移动应用程序的 Anymote 库与 Android TV 通信的主要内容,如果未能解决你的问题,请参考以下文章

适用于移动和电视的 Android 通用应用程序 (Lollipop)

适用于黑莓、iPod 和 Android 的移动编程

适用于所有移动设备的Webview App并上传到Play商店

适用于 android、ios 和 blackberry 的 Codenameone 应用内计费

所有以前的移动视图在适用于操作系统版本高于 4.1.x 的三星设备的 Worklight Android 应用程序中可见

如何使用适用于 Android V2 的 Google Maps 处理地图移动端?