2016-08-25 45 views
1

我們最近更新了Google Cast SDK到版本3.使用此SDK,應該可以通過在OptionsProvider中實現getAdditionalSessionProviders()來添加對非投射設備的支持。我們創建了一個自定義SessionProvider以使用getAdditionalSessionProviders()方法返回。如何使用Google Cast SDK添加自定義會話提供程序3

然而,這SessionProvider是從來沒有使用過,它會在設備已發現,當爲Session文檔中描述按下MediaRouteButton在選擇列表中選擇恐怕只有被使用。但我們無法找到將我們發現的非投射設備添加到此列表的方法。我們已經在線搜索了API,文檔和示例,但我們無法找到如何執行此操作的問題。我們只找到了較老的sdk版本的例子,但它們完全不同且不可用。

我們希望使用此功能將三星電視與三星的SmartView SDK一起添加到Google Cast列表中,就像YouTube和Netflix應用一樣。

+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爲您的設備和所有相關命令/通信進行分級。你可以用一個非常簡單的應用程序使用Media Router API來測試它。有一個關於Media Router的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()方法中通知您),並將Session對象中的命令傳遞到Media Route Provider,如Media Route樣本中所做的那樣。

+0

你能分享一些代碼嗎? – ingsaurabh

2

創建自定義媒體路由提供者:這裏是假的MediaRouteProvider自定義媒體路線。這個類別除了發佈一個虛假的自定義MediaRoute以外,它可以被MediaRouter的Cast SDK查看和選擇。

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

和會話實現:這裏是一個自定義的媒體路由類型假的會話實現。它總是成功的開始/恢復/結束。

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

在你的角色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),並按預期工作,這是正確的方法,還是我要走錯方向?這裏是要點https://gist.github.com/ingsaurabh/6b47babd0d1e64cf144b4d5117bf0c9c – ingsaurabh

相關問題