#java #android #chromecast
#java #Android #chromecast
Вопрос:
Я работаю над приложением, в котором я хочу транслировать определенное видео, которое находится на моем мобильном устройстве. Я хочу транслировать это видео с помощью ChromeCast на проектор. Я сделал учебные пособия по Google Chromecast (https://codelabs.developers.google.com/codelabs/cast-videos-android/#0 например) и уже искал ответ на мой вопрос, но, на мой взгляд, не было идеального ответа для решения моей проблемы.
Есть несколько решений на других языках программирования, но не специально для java.
Моя проблема с Google Cast API заключается в следующем: я хочу выбрать свой ChromeCast, не нажимая кнопку Cast в OptionMenu, которая появляется для выбора одного из CHROMECAST в сети.
- Я только что узнал, что setRouteSelector-Methode из класса CastButtonFactory является частью для выбора устройства. Но я не могу узнать, как выбрать устройство автоматически.
Вот мой код, в котором появляется CastButton (созданный в onCreateOptionsMenu-методе) (это просто код для подключения к ChromeCast. Я еще не реализовал код для выбора и потоковой передачи видео):
Кто-нибудь может мне помочь?
Код:
public class MainActivity extends AppCompatActivity {
private CastSession mCastSession;
private CastContext mCastContext;
private SessionManager mSessionManager;
private final SessionManagerListener mSessionManagerListener = new SessionManagerListenerImpl();
private class SessionManagerListenerImpl implements SessionManagerListener{
@Override
public void onSessionStarting(Session session) {}
@Override
public void onSessionStarted(Session session, String sessionId) {
invalidateOptionsMenu();
}
@Override
public void onSessionStartFailed(Session session, int i) {}
@Override
public void onSessionEnding(Session session) {}
@Override
public void onSessionEnded(Session session, int error) {
finish();
}
@Override
public void onSessionResuming(Session session, String s) {}
@Override
public void onSessionResumed(Session session, boolean wasSuspended) {
invalidateOptionsMenu();
}
@Override
public void onSessionResumeFailed(Session session, int i) {}
@Override
public void onSessionSuspended(Session session, int i) {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCastContext = CastContext.getSharedInstance(this);
mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this, savedInstanceState);
mSessionManager = CastContext.getSharedInstance(this).getSessionManager();
}
@Override
public void onResume(){
mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
mSessionManager.addSessionManagerListener(mSessionManagerListener);
super.onResume();
}
@Override
public void onPause(){
super.onPause();
mSessionManager.removeSessionManagerListener(mSessionManagerListener);
mCastSession = null;
}
@Override
public void onStart(){
super.onStart();
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}}
Комментарии:
1. По какой причине вы хотите это сделать, что противоречит рекомендациям UX, установленным командой cast? Также обратите внимание, что это будет противоречить Условиям предоставления услуг, пункт 3.4.8 (см. developers.google.com/cast/docs/terms )
2. я хочу воспроизвести свое видео, если кто-то войдет в комнату. Так что лучше, чтобы мое устройство автоматически подключалось к моему приложению. Я не хочу сначала выбирать устройство, когда «тестировщик» входит в мою комнату, потому что я должен отправить сигнал другому приложению в определенное время. Я должен уточнить «против условий предоставления услуг», но спасибо за подсказку! 🙂
Ответ №1:
Это возможно с SDK v2. Ознакомьтесь с исходным кодом MediaRouteChooserDialogFragment, элемента пользовательского интерфейса, который позволяет пользователям выбирать кастовое устройство. Вы захотите создать MediaRouter.Callback
и переопределить onRouteAdded(MediaRouter router, MediaRouter.RouteInfo newRoute)
. Если новый маршрут не является маршрутом по умолчанию, выберите его с mMediaRouter.selectRoute(newRoute)
помощью . Это позволит подключить вас к устройству-получателю без какого-либо взаимодействия с пользователем.
Это должно работать для тестирования, но, пожалуйста, не делайте этого в производственном приложении. @AliNaddaf правильно отмечает, что это противоречит правилам UX и условиям предоставления услуг Google Cast (вы можете себе представить, какие могут быть злоупотребления, если приложениям разрешено запускать кастинг без согласия пользователя).
Комментарии:
1. я случайно нажал клавишу ввода …. извините. есть ли способ перечислить все возможные маршруты? что-то вроде «getRoutes ()», чтобы я мог выбрать маршрут, к которому я хочу подключиться? Если нет, является ли RouteInfo именем Chromecast или как мне получить подходящий маршрут? кстати, мы решили зеркально отобразить экран телефона. Я думаю, это намного проще, чем эта попытка. Но в моих личных интересах получить подход к моей проблеме.
2.
MediaRouter.RouteInfo
описывает метаданные маршрута;RouteInfo.getName()
возвращает имя. Следуйте этому руководству до раздела «Обработка выбора устройства». ЗатемMyMediaRouterCallback
переопределите методonRouteAdded
с помощью:if (!newRoute.equals(mMediaRouter.getDefaultRoute()) mMediaRouter.select(newRoute);
Я не знаюgetRoutes()
метода. Если вы хотите написать свой собственныйgetRoutes()
, добавляйтеnewRoute
в aSet<RouteInfo>
всякий раз, когда добавляется новый маршрут, затем определитеgetRoutes()
, чтобы вернуть набор.3. Я, наконец, решил это. Мне просто нужен был обратный вызов в качестве переменной, затем я добавил обратный вызов в метод OnStart() в MediaRouter. Как вы сказали, вам нужно переопределить метод onRouteAdded, но не совсем с вашим кодом, потому что вы предполагаете, что существует только один ChromeCast. Если их несколько, вам необходимо получить идентификатор Uniqe из ChromeCast, к которому вы хотите подключиться. Я получил этот идентификатор, протестировав другое приложение и зарегистрировав идентификатор с помощью: Log.d(ТЕГ, «onRouteAdded: route=» route); Затем просто укажите состояние if-else и задайте текущий маршрут с помощью: MediaRouter.selectRoute (маршрут). Спасибо!