Я пытаюсь написать приложение, которое начнет транслировать экран с телефона Android на телевизор через miracast. Я использую ключ HDMI, так как рассматриваемый телевизор изначально не поддерживает miracast. Я пытался использовать код здесь, но ему нужен идентификатор приложения, который я получил, выполнив следующие действия. Мой вопрос в том, что в инструкциях указано, что мне нужно зарегистрировать ключ miracast, чтобы он мог общаться с неопубликованным приложением «отладка». Однако упоминаются только устройства Google Cast, и это не тот же протокол, что и miracast. Нужно ли мне еще регистрировать ключ?
Есть ли более простой способ программной трансляции на устройство через miracast? Требование — отсутствие взаимодействия с пользователем, поэтому я не могу просто отобразить кнопку приведения.
Я использую Android 5.1, если это актуально.
РЕДАКТИРОВАТЬ: После дальнейших исследований я понял, что Google Cast использует протокол, совершенно отличный от Miracast, и поэтому все разговоры о регистрации ключа не имеют значения. Для использования Miracast на Android регистрация не требуется. Проблема в том, что API скрыт, подробности см. В моем ответе ниже.
Решение проблемы
Так что это возможно, но только на пользовательских версиях Android из-за проблем с разрешениями.
Что вам нужно использовать
Скрытая часть WifiDisplay API делает все это возможным. Этот файл содержит примеры использования API для преобразования отображения. Похоже, что Google в какой-то момент выпустит его публично, хотя, насколько я вижу, он все еще скрыт в последнем мастере API 23.
Как получить доступ к скрытому API
Чтобы использовать скрытые API, это руководство ( зеркало здесь ) является хорошим введением. Однако если вы используете API 22+, это руководство не будет работать, так как формат android.jar изменился, а class.dex был разделен на несколько файлов. Так что этот совет более точен в этом случае. Учтите, что приписку о тоже framework-classes2.dex нужно сделать; это необязательно.
Последняя версия dex2jarинструмента не может превратить файл.dex из API 22 в банку. Решение упоминается автором здесь. Я решил исправить инструмент вместо изменения dex, так как это не сработало для меня. Просто измените строку, упомянутую автором, с выбрасывания RuntimeException на:
return TypeClass.INT;
Как получить разрешение на использование скрытого API
Как только все это будет сделано, следующим шагом будет предоставление вашему приложению CONFIGURE_WIFI_DISPLAYразрешения. К сожалению, как вы можете видеть здесь, он имеет защиту на уровне системы. Это означает, что ваше приложение должно быть подписано тем же ключом, что и система, чтобы использовать это разрешение. Поэтому, если у вас нет закрытого ключа Google, вы не сможете запустить свое приложение на обычных телефонах Android. Мое решение состояло в том, чтобы создать пользовательскую версию CyanogenMod (используя это руководство) с изменением разрешения с «системного» на «нормальное». Это избавляет от необходимости возиться с подписанием чего-либо. Я также сделал то же самое для CONTROL_WIFI_DISPLAYразрешения. Хотя я не совсем уверен, что это необходимо, это не повредит. Оба эти разрешения находятся в frameworks/base/core/res/AndroidManifest.xml. Измените строки 2161-2169 с:
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
android:protectionLevel="signature" />
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
android:protectionLevel="signature" />
К:
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
android:protectionLevel="normal" />
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
android:protectionLevel="normal" />
Затем соберите CyanogenMod как обычно. Я могу подтвердить, что это работает, но это ограничивает работу вашего приложения на устройствах, на которых установлена эта пользовательская версия CyanogenMod. Кроме того, установка CyanogenMod на телефон Android, как правило, аннулирует гарантию.
Комментариев нет:
Отправить комментарий