Open sadr0b0t opened 4 years ago
Проблема частично покрывается возможностью транслировать рабочий стол телефона целиком.
На телефоне Xiaomi: Настройки > Беспроводные сети > Дополнительные функции > Беспроводной дисплей.
После рабочий стол телефона окажется на телевизоре, можно просто открыть приложение иконкой на рабочем столе - звук и видео будут на телевизоре.
На планшете Самсунг (с 7-м андроидом) такой системной настройки нет, поэтому трансляция приложения на экран телевизора будет возможна только в том случае, если получится добавить эту опцию в приложение.
Нифига не получается подключиться к этому же телевизору из приложения используя API MediaRouter
более-менее подробный комент без отладки и кода оставил здесь https://habr.com/ru/company/mobileup/blog/442300/
Тестовые устройства: — Самсунг СмартТВ QLED — Телефон Xiaomi Mi MIX 8 с Андроидом 8 — Планшет Samsung с Андроидом 7
Для начала я бы хотел обойтись простым MediaRouter API без необходимости встраивать в приложение ключи разработчика. Это возможно вообще? Чем отличаются «wireless display» от «chrome cast device» на диаграмме? Для работы с хром-каст устройствами нужен ключ разработчика, а для беспроводных дисплеев нет?
Телевизор Самсунг определяется как «Беспроводной дисплей» (TV Samsung Q9 Series (65)) и я могу подключиться к нему через настройки смартфона и транслировать на него экран телефона целиком. — На планшете такой системной настройки нет, но я могу подключиться к нему из приложения YouTube Kids.
Встроил в приложение кнопку androidx.mediarouter.app.MediaRouteButton (и еще добавил в меню) — в меню она просто не появляется, в варианте MediaRouteButton отображается неактивной — mediaRouter.getRoutes() возвращает один рут (который default route и он не телевизор) — вызываю mediaRouteBtn.showDialog() по другой кнопке, появляется диалог выбора устройства для трансляции и в нем телевизора нет (в диалоге крутится прогресс с поиском и никогда не заканчивается).
Но! Если на телефоне я подключаюсь к дисплею через системные настройки, кнопка становится активной и появляется та, которую я добавлял в меню! В списке mediaRouter.getRoutes() появляется еще один путь — этот самый телевизор. При этом если вызвать диалог mediaRouteBtn.showDialog(), то там видно подключенный телевизор и есть опция отключиться от него. Одна проблема — нафига она нужна, если я и так уже подключен к дисплею. — На планшете глобального способа подключиться к телевизору не нашел, поэтому на нем такой вариант не работает.
Попоробовал еще поставить тестовое приложение отсюда: https://codelabs.developers.google.com/codelabs/cast-videos-android/index.html?index=..%2F..index#2
Не показывает кнопку ни на смартфоне, ни на планшете.
В общем, пока не получается, нах забил. Отладочный код отправил в бранч (dev-mediarouter), пока только локальный (может запушу потом).
Немного отладки (рут TV Samsung появляется только тогда, когда и так подключен к телевизору через системные настройки на телефоне)
2020-09-21 22:34:15.466 17515-17515/su.sadrobot.yashlang I/MediaRouter: Found default route: MediaRouter.RouteInfo{ uniqueId=android/androidx.mediarouter.media.SystemMediaRouteProvider:DEFAULT_ROUTE, name=Телефон, description=null, iconUri=null, enabled=true, connecting=false, connectionState=0, canDisconnect=false, playbackType=0, playbackStream=3, deviceType=0, volumeHandling=1, volume=15, volumeMax=15, presentationDisplayId=10, extras=null, settingsIntent=null, providerPackageName=android }
2020-09-21 22:34:15.505 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable: true
2020-09-21 22:34:15.505 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable_no_default: true
2020-09-21 22:34:15.505 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable count: 2
2020-09-21 22:34:15.506 17515-17515/su.sadrobot.yashlang I/System.out: onStart
2020-09-21 22:34:15.614 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable: true
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable_no_default: true
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: RouteAvailable count: 2
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: name=Телефон, isDefault=true, type=0, type_tv=false, type_speaker=false
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: name=[TV] Samsung Q9 Series (65), isDefault=false, type=1, type_tv=true, type_speaker=false
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: Providers count: 3
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{android/androidx.mediarouter.media.SystemMediaRouteProvider}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=android }
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi.routes count: 2
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: name=Телефон, isDefault=true, type=0, type_tv=false, type_speaker=false
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: name=[TV] Samsung Q9 Series (65), isDefault=false, type=1, type_tv=true, type_speaker=false
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{com.google.android.gms/com.google.android.gms.cast.media.CastMediaRouteProviderService}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=com.google.android.gms }
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi.routes count: 0
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{com.google.android.music/com.google.android.music.dial.DialMediaRouteProviderService}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=com.google.android.music }
2020-09-21 22:34:15.615 17515-17515/su.sadrobot.yashlang I/System.out: pi.routes count: 0
2020-09-21 22:34:15.616 17515-17515/su.sadrobot.yashlang I/System.out: MediaRouteActionProvider.isVisible: true
если телевизор не подключен через системные настройки (по логике, он всё равно должен быть здесь, чтобы к нему подключиться как раз):
2020-09-21 21:56:58.388 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable: true
2020-09-21 21:56:58.388 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable_no_default: false
2020-09-21 21:56:58.388 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable count: 1
2020-09-21 21:56:58.389 15277-15277/su.sadrobot.yashlang I/System.out: onStart
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable: true
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable_no_default: false
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: RouteAvailable count: 1
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: name=Телефон, isDefault=true, type=0, type_tv=false, type_speaker=false
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: Providers count: 3
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{android/androidx.mediarouter.media.SystemMediaRouteProvider}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=android }
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{com.google.android.gms/com.google.android.gms.cast.media.CastMediaRouteProviderService}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=com.google.android.gms }
2020-09-21 21:56:58.490 15277-15277/su.sadrobot.yashlang I/System.out: pi_name: ComponentInfo{com.google.android.music/com.google.android.music.dial.DialMediaRouteProviderService}, pi_to_str: MediaRouter.RouteProviderInfo{ packageName=com.google.android.music }
2020-09-21 21:56:58.491 15277-15277/su.sadrobot.yashlang I/System.out: MediaRouteActionProvider.isVisible: false
Системный лог при подключении к телевизору из приложения YouTube (кстати, тоже то работает, то не работает)
2020-09-16 23:41:25.104 2777-2777/? W/CastMediaRouteProvider: Not a Cast compatible category: MDX_MEDIA_ROUTE_CONTROL_CATEGORY_cl
2020-09-16 23:41:25.104 2777-2777/? W/CastMediaRouteProvider: Not a Cast compatible category: android.media.intent.category.LIVE_AUDIO
2020-09-16 23:41:25.105 1549-8750/? W/ActivityManager: Permission Denial: Accessing service ComponentInfo{com.google.android.music/com.google.android.music.dial.DialMediaRouteProviderService} from pid=16903, uid=10118 that is not exported from uid 10091
2020-09-16 23:41:25.163 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:25.164 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:26.185 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:26.186 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:26.265 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:26.265 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:36.186 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:36.263 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:46.192 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:46.281 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:56.208 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:56.294 16903-16903/? V/MediaRouter: Dispatching route change: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
2020-09-16 23:41:56.295 16903-16903/? V/MediaRouter: Removing route: UserRouteInfo{ name=[TV] Samsung Q9 Series (65), description=null, status=null, category=RouteCategory{ name=Устройства types=ROUTE_TYPE_USER groupable=false }, supportedTypes=ROUTE_TYPE_USER , presentationDisplay=null }
всякие ссылки
https://codelabs.developers.google.com/codelabs/cast-videos-android/#0 https://developers.google.com/cast/docs/design_checklist
https://developer.android.com/guide/topics/media/mediarouter.html https://developer.android.com/guide/topics/media/mediarouteprovider
https://developer.android.com/reference/android/media/MediaRouter https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton
https://stackoverflow.com/questions/31112421/android-media-router-no-discovered-devices
spot.pcc.edu/~mgoodman/developer.android.com/reference/android/media/MediaRouter.html#ROUTE_TYPE_USER
https://habr.com/ru/company/mobileup/blog/442300/ https://codelabs.developers.google.com/codelabs/cast-videos-android/index.html?index=..%2F..index#2
Discovery Troubleshooting https://developers.google.com/cast/docs/discovery https://developers.google.com/cast/docs/registration
https://emanual.github.io/Android-docs/guide/topics/media/mediarouter.html https://emanual.github.io/Android-docs/tools/support-library/features.html#v7-mediarouter https://emanual.github.io/Android-docs/tools/support-library/setup.html
Unable to cast to TV from laptop shows up no devices but will work fine through the app on my phone. https://support.google.com/chromecast/thread/9914321?hl=en
https://developer.android.com/reference/android/media/MediaRouter.UserRouteInfo https://developer.android.com/guide/topics/media/media-routing https://developer.android.com/guide/topics/media/mediarouter https://developer.android.com/reference/android/media/MediaRouter2
https://stackoverflow.com/questions/24936288/mediarouter-connect-second-time
еще пример: транслировать экран из приложения на мобильном устройстве на принимающее приложение, установленное на СмартТВ:
https://github.com/yuliskov/SmartTubeNext
To cast videos from your phone (or other devices), you must link that device to your TV. Unlike the original YouTube app, SmartTubeNext does not automatically show up when you are in the same wifi network. How to link your smartphone and TV: open SmartTubeNext and go to settings go to "link devices" (2nd option) open your YouTube app on your phone, go to settings > watch on TV click on connect using TV-code and enter the code from your TV
Ключевые слова - MediaRouter API и Chromecast
https://developer.android.com/guide/topics/media/mediarouter
Смотрю и слушаю где хочу. Интегрируем Chromecast в Android-приложение https://habr.com/ru/company/mobileup/blog/442300/