2013-12-12 16 views
3

我已經從谷歌的例子應用工作準備我們的Chromecast功能,你可以添加的Chromecast功能,而無需使用動作條

什麼,但是我發現的是,你是需要有一個按鈕在ActionBar(由谷歌實施)爲了得到ActionProvider爲了將您的選擇器附加到。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item); 
    MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem); 
    mediaRouteActionProvider.setRouteSelector(mCaster.getMediaRouteSelector()); 
    return true; 
} 

完整,整個示例和API似乎熱線以使用此按鈕爲中心。我很好地重現了Android的外觀和感覺,但我在我的應用中使用了自定義的ActionBar,這意味着我沒有任何「鉤子」來選擇路由等。

有誰知道如何解決這個問題?

回答

5

首先,我建議您考慮轉移到appcompat操作欄,以便您可以獲得開箱即用的所有優勢。

這就是說,你的問題的答案是:是的,如果你願意做一些額外的工作來管理生命週期並陳述你自己,那麼這是可行的。我概述了這裏的步驟,以便您可以爲自己創建一個工作示例。要求是在項目中有v7支持庫的appcompat和mediarouter,但不需要使用任何特定類型的操作欄或不需要使用MediaRouteButton;事實上,你可以以任何形式或形式觸發發現和其他事情。步驟如下:

  • 確保v7支持庫中的appcompat和mediarouter包含在您的依賴項中。

  • :有mediarouter的V7版本

  • 做平常的事情,即建立一個CastContext,醞釀準備發現(您需要創建的MediaRouteAdapter一個實例,這是我叫myMediaRouteAdapter)是非常重要的


mCastContext = new CastContext(getApplicationContext()); 
MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, 
     myMediaRouteAdapter); 
mMediaRouter = MediaRouter.getInstance(getApplicationContext()); 
mMediaRouteSelector = MediaRouteHelper 
    .buildMediaRouteSelector(MediaRouteHelper.CATEGORY_CAST, 
             "YOUR_APP_NAME", null); 
mMediaRouterCallback = new MyMediaRouterCallback(); 
  • 通過調用啓動發現在你的,比方說,在onStart()以下:

mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, 
         MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 
  • 在您的自定義回調MyMediaRouterCallback中,在添加或刪除路由時監聽路由。當路線被發現時,你的回叫方法將被調用,當它們消失時,將調用onRouteRemoved()。現在您有責任在您選擇的數據結構中保留有效路線列表。可以說,爲了論證的緣故,你在對話框中向用戶展示列表(有意義,不是嗎?),其中用戶在UI中看到路由的名稱(即設備),並且每個項目代表RouteInfo。然後,當用戶點擊的路線上,你需要調用


mMediaRouter.selectRoute(info); 

  • 在您的自定義回調的另一個回調以上通話效果被調用時,onRouteSelected()。在該回調,請撥打以下:

MediaRouteHelper.requestCastDeviceForRoute(info); 

  • 最後,這將調用onDeviceAvailable()回調myMediaRouteAdapter的,並傳遞CastDevice給你,你應該能夠抓住和利用。如果你是一個路線進行的,並希望「取消」了,叫

mMediaRouter.selectRoute(mMediaRouter.getDefaultRoute()); 

希望這是足以讓你去。

+1

非常有幫助 - 'onRouteAdded()'是我錯過的難題。謝謝! – Graeme

+3

現在我們的github repo上有一個示例項目(https://github.com/googlecast/MediaRouter-Cast-Button-android),它正在做類似的事情;檢查該項目中的MediaRouterDiscoveryActivity類。 –

+0

謝謝阿里納達夫。 –

1

我找到了更好的解決方案:

MediaRouteChooserDialog dialog =new MediaRouteChooserDialog(context); 
    dialog.setRouteSelector(mediaRouteSelector); 
    dialog.show(); 

顯示彈出式窗口,將調用onRouteSelected方法上的回調。

+0

你可以給一些解釋你如何使用它...?還有什麼線索是downvote? – sirvon

+0

我的解決方案發生了一些變化,我在佈局中使用了一個元素: 我希望我知道爲什麼downvote - 解決方案對我來說工作得很好。 – Magillus

+0

當使用這個,我得到'java.lang.IllegalArgumentException:背景不能是半透明的:#0'錯誤。不知道爲什麼,不知道在哪裏尋找幫助,但我不認爲這個答案是完整的。 – Krystian

相關問題