2016-08-25 2 views
1

Google Cast SDK를 최근 버전 3으로 업데이트했습니다.이 SDK를 사용하면 OptionsProvider에 getAdditionalSessionProviders()를 구현하여 캐스트가 아닌 장치에 대한 지원을 추가 할 수 있습니다. . getAdditionalSessionProviders() 메소드를 반환하기 위해 맞춤 SessionProvider을 만들었습니다.Google Cast SDK 3에 맞춤 SessionProvider를 추가하는 방법

그러나이 SessionProvider는 절대로 사용되지 않으며 Session 설명서에 설명 된대로 MediaRouteButton을 누르면 장치가 선택되어 선택 목록에서 선택되었을 때만 사용됩니다. 그러나 발견 된 비 캐스트 장치를이 목록에 추가하는 방법을 찾을 수 없습니다. Google은 API, 설명서 및 온라인에서 사용할 수있는 예제를 검색했지만이를 수행하는 방법을 찾지 못했습니다. 이전 sdk 버전의 예제 만 찾았지만 완전히 다르며 사용할 수 없습니다.

이 기능을 사용하여 YouTube 및 Netflix 앱과 마찬가지로 Samsung의 SmartView SDK가 포함 된 Google Cast 목록에 삼성 TV를 추가하고 싶습니다.

+0

가 수행하려고 노력을 [캐스트 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 귀하의 장치 및 모든 관련 명령/통신을 anaging. Media Router API을 사용하여 매우 간단한 앱으로 테스트 할 수 있습니다. 미디어 라우터에 대한 googlesample의 github이 있습니다 : Android BasicMediaRouter Sample.

사용자 정의 세션 클래스에서는 MediaRouter에 액세스 할 수 있습니다 (당신이 가지고 생성자에 전달 컨텍스트) 및 검색 현재 Route : 그와

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

, 당신은 경우 장치를 얻을 수 있어야합니다 현재 선택된 것입니다 (Session의 start() 메소드에서 알림을받습니다). Media Route 샘플에서와 같이 Session 객체의 명령을 Media Route Provider에 전달합니다.

+0

몇 가지 코드를 공유 할 수 있습니까? – ingsaurabh

2

사용자 정의 미디어 경로 공급자 만들기를 : 여기에 가짜 MediaRouteProvider입니다 맞춤 미디어 경로. 이 클래스는 위조 된 맞춤 MediaRoute을 게시하여 MediaRouter의 Cast SDK에서 표시하고 선택할 수 있도록합니다.

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; 
    } 
} 

그리고 세션 구현 :

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 구현을 필요로 여기에 사용자 정의 용지 경로 유형에 대한 가짜 세션 구현입니다.항상 시작/다시 시작/끝에서 성공합니다. 응용 프로그램에서

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 공급자 추가 : 당신의 캐스트 V3 보낸 응용 프로그램에서

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); 
    } 
} 

, 추가 세션 업체 지정

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

좋아요. CustomSession과 함께 CastSession을 동시에 사용하는 방법이 아직 명확하지 않습니다. CustomMediaRouteProvider와 사용자 세션이 어떻게 상호 작용하는지, RemotePlaybackClient를 사용해야합니까? – ingsaurabh

+0

캐스트 사용 가능 앱에서 모든 사용자 지정 경로가 캐스트 세션으로 검색 및 관리 할 수 ​​있습니다. –

+0

uamp에서 내 맞춤 경로를 테스트하고 있습니다. 현재 CastSessionManagerListener입니다. 세션의 인스턴스를 확인하고 적절한 재생 (CastPlayback/CustomPlayback)을 만들고 예상대로 작동합니다. 잘못된 방향으로 가고 있습니까? 여기 요점은 https://gist.github.com/ingsaurabh/6b47babd0d1e64cf144b4d5117bf0c9c입니다. – ingsaurabh