2016-08-25 6 views
1

Недавно мы обновили SDK Google Cast до версии 3. С помощью этого SDK можно было бы добавить поддержку для не-литых устройств, реализовав getAdditionalSessionProviders() в OptionsProvider , Мы создали настраиваемый SessionProvider, чтобы вернуться с помощью метода getAdditionalSessionProviders().Как добавить пользовательский SessionProvider с Google Cast SDK 3

Однако этот SessionProvider никогда не используется и, вероятно, будет использоваться только тогда, когда устройство было обнаружено и выбрано в списке выбора при нажатии MediaRouteButton, как описано в документации Session. Но мы не можем найти способ добавить наше обнаруженное не-литое устройство в этот список. Мы искали API, документацию и примеры, доступные в Интернете, но мы не могли найти, как это сделать. Мы только нашли примеры более старых версий sdk, но они совершенно разные и не пригодны для использования.

Мы хотели бы использовать эту функциональность, чтобы добавить телевизор Samsung в список Google Cast с помощью SmartView SDK от Samsung, как это делают приложения YouTube и Netflix.

+0

вы пытались выполнить [Cast SDK v3 Android Codelab] (https://codelabs.developers.google.com/codelabs/cast-videos-android/#0)? также проверьте этот [документ] (https://developers.google.com/cast/docs/android_sender_integrate). –

+0

Да, я проверил это, но я ничего не мог найти о добавлении там не-литых устройств. Тем не менее, мы реализовали все остальные части SDK. – mennovogel

+0

Проверьте это (https://productforums.google.com/forum/#!topic/chromecast/hoHJMeM5Qns), если он может помочь вам спариться. –

ответ

0

Итак, у меня была такая же проблема, как и вы, и я нашел способ сделать это, но, как вы отметили, поскольку на этой теме ничего не документировано, я не уверен, что это «правильный способ сделай это".

Вот в основном то, что я делаю:

Поставщик медиа-маршрута отвечает за m подгонять ваше устройство и все связанные с ним команды/связь. Вы можете протестировать его с помощью очень простого приложения, используя Media Router API. Существует github от googlesample о Media Router: Android BasicMediaRouter Sample.

В вас пользовательский класс Session, вы можете получить доступ к MediaRouter (вы получили контекст, передаваемый в конструкторе) и получить текущий Route:

MediaRouter mediaRouter = MediaRouter.getInstance(context); 
    if (mediaRouter != null && mediaRouter.getSelectedRoute() != null) 
    Log.d("Cast", "Selected route name is " + mediaRouter.getSelectedRoute().getName()); 

При том, что вы должны быть в состоянии получить устройство, если оно (вы будете уведомлены в методе start() сеанса) и передайте команды из объекта Session своему поставщику медиа-маршрута, как это сделано в примере Media Route.

+0

Можете ли вы поделиться некоторым кодом? – ingsaurabh

2

Создание пользовательских медиа маршрута поставщика: Вот это подделка MediaRouteProvider для настраиваемый медиа-маршрут. Этот класс ничего не делает, кроме как публиковать фальшивый пользовательский MediaRoute, чтобы его можно было увидеть и выбрать с помощью Cast SDK из MediaRouter.

import android.content.Context; 
import android.content.IntentFilter; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.support.v7.media.MediaRouteDescriptor; 
import android.support.v7.media.MediaRouteDiscoveryRequest; 
import android.support.v7.media.MediaRouteProvider; 
import android.support.v7.media.MediaRouteProvider.RouteController; 
import android.support.v7.media.MediaRouteProviderDescriptor; 
import android.support.v7.media.MediaRouter; 
import java.util.ArrayList; 

public final class CustomMediaRouteProvider extends MediaRouteProvider { 
    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC; 
    private static MediaRouteDescriptor DEFAULT_MEDIA_ROUTE_DESCRIPTOR; 

    static { 
    // This filter will be used by Cast SDK to match the session category. 
    IntentFilter customControls = new IntentFilter(); 
    customControls.addCategory(CustomSessionProvider.CUSTOM_CATEGORY); 

    CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>(); 
    CONTROL_FILTERS_BASIC.add(customControls); 

    Bundle extras = new Bundle(); 
    extras.putCharSequence("ROUTE_URL", "http://abcdef.cyz"); 
    DEFAULT_MEDIA_ROUTE_DESCRIPTOR = 
     new MediaRouteDescriptor.Builder("fake-custom-route-id", "fake custom route") 
      .setDescription("Foo description") 
      .addControlFilters(CONTROL_FILTERS_BASIC) 
      .setPlaybackStream(AudioManager.STREAM_MUSIC) 
      .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE) 
      .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) 
      .setVolumeMax(100) 
      .setVolume(10) 
      .setExtras(extras) 
      .build(); 
    } 

    public CustomMediaRouteProvider(Context context) { 
    super(context); 
    } 

    @Override 
    public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) { 
    if (request == null || request.getSelector() == null) { 
     return; 
    } 

    publishRoutes(); 
    } 

    @Override 
    public RouteController onCreateRouteController(String routeId) { 
    return null; 
    } 

    private void publishRoutes() { 
    MediaRouteProviderDescriptor providerDescriptor = 
     new MediaRouteProviderDescriptor.Builder().addRoute(DEFAULT_MEDIA_ROUTE_DESCRIPTOR).build(); 

    setDescriptor(providerDescriptor); 
    } 
} 

Вам нужна реализация SessionProvider для пользовательской сессии:

import android.content.Context; 
import com.google.android.gms.cast.framework.Session; 
import com.google.android.gms.cast.framework.SessionProvider; 

public class CustomSessionProvider extends SessionProvider { 
    public static final String CUSTOM_CATEGORY = "CUSTOM"; 

    public CustomSessionProvider(Context applicationContext) { 
    super(applicationContext, CUSTOM_CATEGORY); 
    } 

    @Override 
    public Session createSession(String sessionId) { 
    return new CustomSession(getContext(), getCategory(), sessionId); 
    } 

    @Override 
    public boolean isSessionRecoverable() { 
    return true; 
    } 
} 

И реализация Session: Вот подделка реализации Сеанса для пользовательского типа медиа маршрута.Это всегда удается при запуске/возобновлении/завершении.

import android.content.Context; 
import android.os.Bundle; 
import com.google.android.gms.cast.framework.Session; 

public class CustomSession extends Session { 
    private static final String FAKE_SESSION_ID = "custom.session.id.12345"; 

    CustomSession(Context applicationContext, String category, String sessionId) { 
    super(applicationContext, category, sessionId); 
    } 

    @Override 
    protected void start(Bundle routeInfoExtra) { 
    notifySessionStarted(FAKE_SESSION_ID); 
    } 

    @Override 
    protected void resume(Bundle routeInfoExtra) { 
    notifySessionResumed(false); 
    } 

    @Override 
    protected void end(boolean stopCasting) { 
    notifySessionEnded(0); 
    } 
} 

В вашем Cast V3 приложении отправителя, указать дополнительный поставщик сеанса:

public class CastOptionsProvider implements OptionsProvider { 
@Override 
    public List<SessionProvider> getAdditionalSessionProviders(Context appContext) { 
    List<SessionProvider> additionalProviders = new ArrayList<>(); 
    additionalProviders.add(new CustomSessionProvider(appContext)); 
    return additionalProviders; 
    } 
} 

В вашей заявке добавить поставщик MediaRouter:

public class CastVideosApplication extends Application { 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    MediaRouter mediaRouter = MediaRouter.getInstance(this); 
    mediaRouter.addProvider(new CustomMediaRouteProvider(this)); 
    } 
} 
+0

Отлично, я до сих пор не понимаю, как использовать CastSession вместе с CustomSession (используя оба одновременно), также как взаимодействует пользовательский сеанс с CustomMediaRouteProvider, нужно ли использовать RemotePlaybackClient – ingsaurabh

+0

. В вашем приложении с включенным приложением все пользовательские маршруты будут быть обнаружены и управляться как сеансы литья. –

+0

Я тестирую свой пользовательский маршрут в uamp, пока в MusicService CastSessionManagerListener я проверяю экземпляр сессии и создаю соответствующее воспроизведение (CastPlayback/CustomPlayback), и это работает, как ожидалось, это правильный подход или я иду в неправильном направлении? здесь gist https://gist.github.com/ingsaurabh/6b47babd0d1e64cf144b4d5117bf0c9c – ingsaurabh

 Смежные вопросы

  • Нет связанных вопросов^_^