Использование библиотеки Anymote для мобильного приложения Android для связи с Android TV

Общий случай использования:

Для своего проекта я пытаюсь реализовать несколько простых игр, таких как Pong или простой тест для Android TV. Телевизор соответственно Android TV box отображает игру и управляет логикой (отдельный модуль). Смартфоны и планшеты должны выступать в качестве простых контроллеров для этих игр (отдельный модуль). Например: при игре в понг приложение на телефоне показывает только две стрелки для перемещения весла игрока вверх или вниз. Для соединения и связи между приложением на телевизоре и приложением на мобильном устройстве используется API Google Nearby Connections.

Актуальная проблема:

Теперь требуется, чтобы пользователь мог начать игру в понг со своего телефона. Это означает: он открывает простое приложение контроллера на своем мобильном устройстве, выбирает псевдоним и затем решает, хочет ли он начать новую игру в понг или присоединиться к существующей игре в понг. Таким образом, когда пользователь захочет запустить игру в понг, он сможет нажать кнопку на экране, и приложение на 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'
}

}

и добавил и адаптировал BlackJackRemoteActivity.java из каталога googletv-android-samples/BlackJackTVRemote/src/com/example/google/tv/remote/blackjack/ из приведенной выше ссылки на мой вариант использования в мобильном модуле. После этого я просто хотел проверить, могу ли я получить контроль над 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: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: androidtvportablecontroller, PID: 23592 java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider на com.google.polo.ssl.Ssltificjl3 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. Вы можете найти его по банке или ссылке.

Вы также можете посетить этот ответ. Есть ли уменьшенная версия BouncyCastleProvider на Android?, который использует аналогичную библиотеку, совместимую с Android.

Другие вопросы по тегам