public final class MediaRouter
extends Object
java.lang.Object | |
↳ | android.support.v7.media.MediaRouter |
MediaRouter允许应用程序控制从当前设备到外部扬声器和目标设备的媒体通道和流的路由。
MediaRouter实例通过getInstance(Context)
检索。 应用程序可以向媒体路由器查询当前选定的路由及其功能,以确定如何将内容发送到路由的目的地。 应用程序也可以通过send control requests
向路由请求路由的目的地执行某些远程控制功能,例如播放媒体。
有关应用程序如何将新媒体路线发布到媒体路由器的信息,另请参阅 MediaRouteProvider
。
媒体路由器API不是线程安全的; 所有与它的交互都必须从流程的主线程完成。
Nested classes |
|
---|---|
class |
MediaRouter.Callback 用于接收有关媒体路由更改事件的接口。 |
class |
MediaRouter.ControlRequestCallback 用媒体控制请求的结果调用的回调。 |
class |
MediaRouter.ProviderInfo 提供有关媒体路由提供商的信息。 |
class |
MediaRouter.RouteInfo 提供有关媒体路由的信息。 |
Public methods |
|
---|---|
void |
addCallback(MediaRouteSelector selector, MediaRouter.Callback callback, int flags) 注册回调以发现匹配选择器的路由,并在发生更改时接收事件。 |
void |
addCallback(MediaRouteSelector selector, MediaRouter.Callback callback) 注册回调以发现匹配选择器的路由,并在发生更改时接收事件。 |
void |
addProvider(MediaRouteProvider providerInstance) 在此应用程序过程中注册媒体路由提供程序。 |
void |
addRemoteControlClient(Object remoteControlClient) 添加远程控制客户端以启用对所选路线的音量的远程控制。 |
MediaRouter.RouteInfo |
getDefaultRoute() 获取在系统上播放媒体内容的默认路由。 |
static MediaRouter |
getInstance(Context context) 获取与上下文关联的媒体路由器服务的实例。 |
MediaSessionCompat.Token |
getMediaSessionToken() |
List<MediaRouter.ProviderInfo> |
getProviders() 获取有关此媒体路由器当前已知的 |
List<MediaRouter.RouteInfo> |
getRoutes() 获取有关此媒体路由器当前已知的 |
MediaRouter.RouteInfo |
getSelectedRoute() 获取当前选择的路线。 |
boolean |
isRouteAvailable(MediaRouteSelector selector, int flags) 如果存在与指定选择器匹配的路线,则返回true。 |
void |
removeCallback(MediaRouter.Callback callback) 删除指定的回调。 |
void |
removeProvider(MediaRouteProvider providerInstance) 在此应用程序进程中取消注册媒体路由提供程序。 |
void |
removeRemoteControlClient(Object remoteControlClient) 删除远程控制客户端。 |
void |
selectRoute(MediaRouter.RouteInfo route) 选择指定的路线。 |
void |
setMediaSession(Object mediaSession) 设置媒体会话以启用对所选路线的音量的远程控制。 |
void |
setMediaSessionCompat(MediaSessionCompat mediaSession) 设置compat媒体会话以启用对所选路线的音量的远程控制。 |
void |
unselect(int reason) 取消选择当前轮次并改为选择默认路线。 |
MediaRouter.RouteInfo |
updateSelectedRoute(MediaRouteSelector selector) 如果选择的路线与指定的选择器匹配,则返回选定的路线,否则选择默认路线并返回它。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE
标志为 isRouteAvailable(MediaRouteSelector, int)
:忽略默认路由。
该标志用于确定匹配的非默认路由是否可用。 该约束可用于决定是否向用户提供路由选择器对话框。 如果没有非默认选择,则提供选择器没有意义。
常数值:1(0x00000001)
int AVAILABILITY_FLAG_REQUIRE_MATCH
标记为 isRouteAvailable(MediaRouteSelector, int)
:要求匹配实际路线。
如果未设置此标志,则即使发现未处于进行中或尚未找到匹配路线,如果可以发现匹配路线,则isRouteAvailable(MediaRouteSelector, int)
将返回true。 此功能用于通过消除在low-RAM devices
上执行被动路由发现的需要来节省资源。
如果设置了这个标志,那么 isRouteAvailable(MediaRouteSelector, int)
只会在实际发现匹配路线时返回true。
常量值:2(0x00000002)
int CALLBACK_FLAG_FORCE_DISCOVERY
标记为 addCallback(MediaRouteSelector, MediaRouter.Callback)
:在回调被注册时请求被动路由发现,即使在 low-RAM devices
。
此标志对低RAM设备有显着的性能影响,因为它可能会导致许多媒体路由提供程序同时启动。 使用CALLBACK_FLAG_REQUEST_DISCOVERY
代替避免在这些设备上执行被动发现要好得多。 有关详细信息,请参阅addCallback
。
也可以看看:
常量值:8(0x00000008)
int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
标记为 addCallback(MediaRouteSelector, MediaRouter.Callback)
:在注册回调时主动扫描路由。
当此标志被指定时,媒体路由器将主动扫描新的路由。 除主动扫描外,某些路由(如wifi显示路由)可能无法发现。 当用户打开路由选择器对话框时,通常会使用此标志以确保路由信息是最新的。
主动扫描可能消耗大量功率,并可能对无线连接造成干扰。 因此,只有在实际需要满足用户请求发现和选择新路由时,才会请求主动扫描,这一点很重要。
此标志意味着 CALLBACK_FLAG_REQUEST_DISCOVERY
但执行主动扫描比普通的发现请求要昂贵得多。
常数值:1(0x00000001)
int CALLBACK_FLAG_REQUEST_DISCOVERY
标记为 addCallback(MediaRouteSelector, MediaRouter.Callback)
:注册此回调时请求被动路由发现,但 low-RAM devices
除外。
当此标志被指定时,媒体路由器将尝试发现路由。 尽管路由发现的目的是高效,但检查新路由可能会导致一些网络活动并可能会缓慢耗尽电池。 因此,应用程序只能在前台运行时指定CALLBACK_FLAG_REQUEST_DISCOVERY
,并且希望为用户提供连接到新路由的选项。
应用程序通常应在activity's
onStart
方法中使用此标志添加回调,并在onStop
方法中将其onStop
。 MediaRouteDiscoveryFragment
片段也可用于此目的。
On low-RAM devices
this flag will be ignored. Refer to addCallback
for details.
也可以看看:
常量值:4(0x00000004)
int CALLBACK_FLAG_UNFILTERED_EVENTS
标记为 addCallback(MediaRouteSelector, MediaRouter.Callback)
:不要过滤路由事件。
当指定此标志时,即使回调的筛选器不匹配,也会针对影响任何路由的事件调用回调。
常量值:2(0x00000002)
int UNSELECT_REASON_DISCONNECTED
当用户按下断开连接按钮断开并继续播放时传递到 onUnselect(int)
和 onRouteUnselected(MediaRouter, RouteInfo, int)
。
常数值:1(0x00000001)
int UNSELECT_REASON_ROUTE_CHANGED
当用户选择不同的路线时,传递到 onUnselect(int)
和 onRouteUnselected(MediaRouter, RouteInfo, int)
。
常量值:3(0x00000003)
int UNSELECT_REASON_STOPPED
当用户按下停止投射按钮时,传递到 onUnselect(int)
和 onRouteUnselected(MediaRouter, RouteInfo, int)
。
常量值:2(0x00000002)
int UNSELECT_REASON_UNKNOWN
当路由未被选择的原因未知时,传递到 onUnselect(int)
和 onRouteUnselected(MediaRouter, RouteInfo, int)
。
常量值:0(0x00000000)
void addCallback (MediaRouteSelector selector, MediaRouter.Callback callback, int flags)
注册回调以发现匹配选择器的路由,并在发生更改时接收事件。
选择器描述应用程序想要发现的路线种类。 例如,如果应用程序想要使用实时音频路由,那么它应该在其选择器中包含live audio media control intent category
,方法是将回调添加到媒体路由器。 选择器可以包括任何数量的类别。
如果回调已经被注册,那么选择器将被添加到回调所监控的选择器集合中。
默认情况下,只有对影响与指定选择器匹配的路由的事件才会调用回调。 通过在注册回调时指定CALLBACK_FLAG_UNFILTERED_EVENTS
标志,可以禁用事件筛选。
应用程序应该使用 isRouteAvailable(MediaRouteSelector, int)
方法来确定是否可以发现具有所需功能的路线,因此是否应该向用户显示媒体路线按钮。
当应用程序位于前台时,应使用CALLBACK_FLAG_REQUEST_DISCOVERY
标志来请求在有足够资源允许持续被动发现的情况下执行被动发现。 在low-RAM devices
这个标志将被忽略以节约资源。
当绝对必须执行被动发现时,即使在低RAM设备上,也应该使用CALLBACK_FLAG_FORCE_DISCOVERY
标志。 此标志对低RAM设备有显着的性能影响,因为它可能会导致许多媒体路由提供程序同时启动。 使用CALLBACK_FLAG_REQUEST_DISCOVERY
代替避免在这些设备上执行被动发现要好得多。
当显示媒体路由选择器对话框时,应使用CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
标志以确认用户可以连接的可用路由的存在。 这个标志可能会使用更多的电力。
public class MyActivity extends Activity { private MediaRouter mRouter; private MediaRouter.Callback mCallback; private MediaRouteSelector mSelector; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRouter = Mediarouter.getInstance(this); mCallback = new MyCallback(); mSelector = new MediaRouteSelector.Builder() .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO) .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) .build(); } // Add the callback on start to tell the media router what kinds of routes // the application is interested in so that it can try to discover suitable ones. public void onStart() { super.onStart(); mediaRouter.addCallback(mSelector, mCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); MediaRouter.RouteInfo route = mediaRouter.updateSelectedRoute(mSelector); // do something with the route... } // Remove the selector on stop to tell the media router that it no longer // needs to invest effort trying to discover routes of these kinds for now. public void onStop() { super.onStop(); mediaRouter.removeCallback(mCallback); } private final class MyCallback extends MediaRouter.Callback { // Implement callback methods as needed. } }
Parameters | |
---|---|
selector |
MediaRouteSelector : A route selector that indicates the kinds of routes that the callback would like to discover. |
callback |
MediaRouter.Callback : The callback to add. |
flags |
int : Flags to control the behavior of the callback. May be zero or a combination of CALLBACK_FLAG_PERFORM_ACTIVE_SCAN and CALLBACK_FLAG_UNFILTERED_EVENTS . |
void addCallback (MediaRouteSelector selector, MediaRouter.Callback callback)
注册回调以发现匹配选择器的路由,并在发生更改时接收事件。
这是一种方便的方法,与调用 addCallback(MediaRouteSelector, Callback, int)
没有标志具有相同的效果。
Parameters | |
---|---|
selector |
MediaRouteSelector : A route selector that indicates the kinds of routes that the callback would like to discover. |
callback |
MediaRouter.Callback : The callback to add. |
void addProvider (MediaRouteProvider providerInstance)
在此应用程序过程中注册媒体路由提供程序。
The provider will be added to the list of providers that all MediaRouter
instances within this process can use to discover routes.
Parameters | |
---|---|
providerInstance |
MediaRouteProvider : The media route provider instance to add. |
void addRemoteControlClient (Object remoteControlClient)
添加远程控制客户端以启用对所选路线的音量的远程控制。
远程控制客户端必须先使用 AudioManager.registerRemoteControlClient
方法向音频管理器注册。
Parameters | |
---|---|
remoteControlClient |
Object : The RemoteControlClient to register. |
MediaRouter.RouteInfo getDefaultRoute ()
获取在系统上播放媒体内容的默认路由。
系统始终提供默认路由。
Returns | |
---|---|
MediaRouter.RouteInfo |
The default route, which is guaranteed to never be null. |
MediaRouter getInstance (Context context)
获取与上下文关联的媒体路由器服务的实例。
应用程序负责持有对返回的 MediaRouter
实例的强引用,例如通过将实例存储在 Activity
的字段中,以确保只要应用程序正在使用其功能,媒体路由器就保持活动状态。
换句话说,支持库仅向每个媒体路由器实例保存weak reference
。 当没有剩余的媒体路由器实例强引用时,其所有回调将被删除,并且路由发现将不再以其名义执行。
Parameters | |
---|---|
context |
Context
|
Returns | |
---|---|
MediaRouter |
The media router instance for the context. The application must hold a strong reference to this object as long as it is in use. |
MediaSessionCompat.Token getMediaSessionToken ()
Returns | |
---|---|
MediaSessionCompat.Token |
List<MediaRouter.ProviderInfo> getProviders ()
获取有关此媒体路由器当前已知的 route providers
信息。
Returns | |
---|---|
List<MediaRouter.ProviderInfo> |
List<MediaRouter.RouteInfo> getRoutes ()
获取有关此媒体路由器当前已知的 routes
信息。
Returns | |
---|---|
List<MediaRouter.RouteInfo> |
MediaRouter.RouteInfo getSelectedRoute ()
获取当前选择的路线。
应用程序应该检查路线的 media control intent filters
以在尝试使用路线之前评估路线的功能。
public boolean playMovie() { MediaRouter mediaRouter = MediaRouter.getInstance(context); MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(); // First try using the remote playback interface, if supported. if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) { // The route supports remote playback. // Try to send it the Uri of the movie to play. Intent intent = new Intent(MediaControlIntent.ACTION_PLAY); intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); intent.setDataAndType("http://example.com/videos/movie.mp4", "video/mp4"); if (route.supportsControlRequest(intent)) { route.sendControlRequest(intent, null); return true; // sent the request to play the movie } } // If remote playback was not possible, then play locally. if (route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)) { // The route supports live video streaming. // Prepare to play content locally in a window or in a presentation. return playMovieInWindow(); } // Neither interface is supported, so we can't play the movie to this route. return false; }
Returns | |
---|---|
MediaRouter.RouteInfo |
The selected route, which is guaranteed to never be null. |
boolean isRouteAvailable (MediaRouteSelector selector, int flags)
如果存在与指定选择器匹配的路线,则返回true。
如果存在与选择器匹配的任何可用路由(无论它们是启用还是禁用),则此方法返回true。 如果指定了AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE
标志,那么该方法将只考虑非默认路由。
在low-RAM devices
如果可以发现匹配的路由(即使发现未处于进行中或者尚未找到匹配路由),此方法将返回true。 使用AVAILABILITY_FLAG_REQUIRE_MATCH
要求实际匹配。
Parameters | |
---|---|
selector |
MediaRouteSelector : The selector to match. |
flags |
int : Flags to control the determination of whether a route may be available. May be zero or some combination of AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE and AVAILABILITY_FLAG_REQUIRE_MATCH . |
Returns | |
---|---|
boolean |
True if a matching route may be available. |
void removeCallback (MediaRouter.Callback callback)
删除指定的回调。 它将不再接收有关媒体路由更改的事件。
Parameters | |
---|---|
callback |
MediaRouter.Callback : The callback to remove. |
void removeProvider (MediaRouteProvider providerInstance)
在此应用程序进程中取消注册媒体路由提供程序。
该提供程序将从提供程序列表中删除,该进程中的所有 MediaRouter
实例均可用于发现路由。
Parameters | |
---|---|
providerInstance |
MediaRouteProvider : The media route provider instance to remove. |
void removeRemoteControlClient (Object remoteControlClient)
删除远程控制客户端。
Parameters | |
---|---|
remoteControlClient |
Object : The RemoteControlClient to unregister. |
void selectRoute (MediaRouter.RouteInfo route)
选择指定的路线。
Parameters | |
---|---|
route |
MediaRouter.RouteInfo : The route to select. |
void setMediaSession (Object mediaSession)
设置媒体会话以启用对所选路线的音量的远程控制。 当使用媒体会话时,应该使用这个而不是addRemoteControlClient(Object)
。 将会话设置为空以清除它。
Parameters | |
---|---|
mediaSession |
Object : The MediaSession to use. |
void setMediaSessionCompat (MediaSessionCompat mediaSession)
设置compat媒体会话以启用对所选路线的音量的远程控制。 这应该是用来代替addRemoteControlClient(Object)
使用时MediaSessionCompat
。 将会话设置为空以清除它。
void unselect (int reason)
取消选择当前轮次并改为选择默认路线。
给出的理由必须是以下之一:
UNSELECT_REASON_UNKNOWN
UNSELECT_REASON_DISCONNECTED
UNSELECT_REASON_STOPPED
UNSELECT_REASON_ROUTE_CHANGED
Parameters | |
---|---|
reason |
int : The reason for disconnecting the current route. |
MediaRouter.RouteInfo updateSelectedRoute (MediaRouteSelector selector)
如果选择的路线与指定的选择器匹配,则返回选定的路线,否则选择默认路线并返回它。 如果有一条实时音频路由(通常是蓝牙A2DP),它将被选择而不是默认路由。
Parameters | |
---|---|
selector |
MediaRouteSelector : The selector to match. |
Returns | |
---|---|
MediaRouter.RouteInfo |
The previously selected route if it matched the selector, otherwise the newly selected default route which is guaranteed to never be null. |