Шаги, чтобы программно привести от андроида к ресиверу miracast
Я пытаюсь написать приложение, которое начнет трансляцию экрана с телефона Android на телевизор через miracast. Я использую ключ HDMI, поскольку рассматриваемый телевизор изначально не поддерживает miracast. Я пробовал код здесь, но ему нужен идентификатор приложения, который я получил после этих шагов. Мой вопрос в том, что инструкции, похоже, указывают, что мне нужно зарегистрировать ключ miracast, чтобы он общался с неопубликованным приложением "отладка". Однако упоминаются только устройства Google Cast, и это не тот же протокол, что и miracast. Нужно ли мне регистрировать ключ?
Существует ли более простой способ программной трансляции на устройство через miracast? Требование - отсутствие взаимодействия с пользователем, поэтому я не могу просто отобразить кнопку приведения.
Я использую Android 5.1, если это актуально.
РЕДАКТИРОВАТЬ: После дальнейших исследований, я понял, что Google Cast использует совершенно другой протокол, чем Miracast, и, следовательно, все разговоры о регистрации ключа не имеет значения. Для того, чтобы сделать Miracast в Android, регистрация не требуется. Проблема в том, что API скрыт, подробности смотрите в моем ответе ниже.
1 ответ
Так что это возможно, но только на пользовательских версиях Android из-за проблем с разрешениями.
Что вам нужно использовать
Скрытая часть API WifiDisplay делает все это возможным. Этот файл содержит примеры того, как использовать API для приведения отображения. Похоже, что в какой-то момент Google выпустит его публично, хотя, насколько я вижу, он все еще скрыт в последней версии API 23.
Как получить доступ к скрытому API
Чтобы использовать скрытые API, это руководство представляет собой хорошее введение. Однако, если вы используете API 22+, то это руководство не будет работать, так как формат android.jar изменился, а classes.dex был разбит на несколько файлов. Так что этот совет более точен в этом случае. Обратите внимание, что постскриптум о framework-classes2.dex
такжедолжно быть сделано; это не обязательно.
Последняя версия dex2jar
инструмент не может превратить файл.dex из API 22 в банку. Решение упомянуто автором здесь. Я решил исправить инструмент, а не менять декс, так как это не сработало для меня. Просто измените строку, о которой упоминает автор, от выдачи RuntimeException на:
return TypeClass.INT;
Как получить разрешение на использование скрытого API
Как только это будет сделано, следующим шагом будет дать вашему приложению CONFIGURE_WIFI_DISPLAY
разрешение. К сожалению, как вы можете видеть здесь, он имеет защиту на уровне системы. Это означает, что ваше приложение должно быть подписано тем же ключом, что и система, чтобы использовать это разрешение. Поэтому, если у вас нет личного ключа Google, ваше приложение не может работать на обычных телефонах Android. Мое решение состояло в том, чтобы создать пользовательскую версию CyanogenMod(используя это руководство), с разрешением, измененным с 'system' на 'normal'. Это избавляет от необходимости беспокоиться о подписании чего-либо. Я также сделал то же самое для 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 обычно аннулирует гарантию.
try {
startActivity(new Intent("android.settings.CAST_SETTINGS"));
return;
} catch (Exception exception1) {
Toast.makeText(getApplicationContext(), "Device not supported", Toast.LENGTH_LONG).show();
}
hope this will help you, done screen mirroring with the cast settings, it uses your device's cast service. but you have to connect with same wifi both device and tv