1122743_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1122743_zh-CN

1122743_zh-CN

扩展你的 Android 应用显示<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

许多用户询问过但仍在为 Android 开发中的功能之一是扩展桌面功能。目前,Android 允许您在两个显示器上镜像您的桌面,但您仍然无法像使用 Linux 或 Windows 等任何其他操作系统那样扩展您的桌面。

本教程旨在向您展示如何使用特殊对象来控制辅助或外部显示器上显示的内容,从而取代屏幕镜像。

那么我们该怎么做呢?


演示文稿是在外部显示器上以视图层次结构的形式显示用户界面的容器。这非常类似于对话框,因为它显示与其活动分开的 UI,但不同之处在于演示文稿显示在外部显示器上,而对话框将其显示在主屏幕上。现在,由于这个原因,外部显示器上的 UI 要使用的资源与主屏幕上使用的资源不同,演示的上下文不是活动。

我们如何选择将此演示文稿发送到哪里?

最简单的方法是使用 MediaRouter API。mediarouter 的作用是跟踪系统上可用的音频和视频路由。无论何时选择或取消选择路线,MediaRouter 都会发送通知。应用程序可以简单地监视这些通知并自动在首选演示显示屏上显示或关闭演示。

首选演示显示器是媒体路由器建议应用程序在想要在辅助显示器上显示内容时使用的显示器。如果没有首选的演示显示,则应用程序应该在本地显示其内容而不使用演示。

使用 Mediarouter

MediaRouter 是通过调用 getSystemService() 并请求 MEDIA_ROUTER_SERVICE 获得的系统服务。

我们应该使用 mediarouter 在首选的演示显示器上创建和显示演示文稿:


MediaRouter mediaRouter = ( MediaRouter ) context . getSystemService ( Context . MEDIA_ROUTER_SERVICE );
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute ( ) ;​​
如果(路线!= null ) {
显示presentationDisplay =路由.getPresentationDisplay () ;
如果( presentationDisplay != null ) {
演示文稿=新MyPresentation (上下文, presentationDisplay ) ;
演示
.展示();
}
}



为了在您的应用中使用此框架,您需要获取 MediaRouter 框架对象的一个实例并附加一个 MediaRouter.Callback 对象来监听可用媒体路由中的事件。

实现媒体路由器 API 的 Android 应用程序需要包含一个 Cast 按钮,以允许用户选择媒体路由在辅助输出设备上播放媒体。实现 Cast 按钮的推荐方法是从 ActionBarActivity() 扩展您的活动并使用 onCreateOptionMenu() 方法添加选项菜单。Cast 按钮必须使用 MediaRouteActionProvider 类作为其操作:


xml 版本= "1.0"编码= "utf-8" ?>
<菜单xmlns:android = " http://schemas.android.com/apk/res/android "
xmlns:app = " http://schemas.android.com/apk/res-auto "
>

<项目机器人:ID = “@ + id / media_route_menu_item”
机器人:标题= “@string/media_route_menu_title”
应用程序:actionProviderClass = “android.support.v7.app.MediaRouteActionProvider”
app:showAsAction = “总是”
/>


媒体路由器框架通过附加到媒体路由器框架对象的回调对象与应用程序进行通信。有必要扩展回调对象以便在媒体路由连接时接收消息。

一旦为媒体路由器定义了回调,您就需要将其附加到媒体路由器对象。下面的示例演示了如何使用生命周期方法来适当地添加和删除应用程序的媒体路由器回调对象。您需要添加和删除它,因为无论何时关闭应用程序或将其放在后台,它都需要是空闲的,以便其他应用程序在必要时使用它。


公共类MediaRouterPlaybackActivity扩展了ActionBarActivity {
私人MediaRouter mMediaRouter ;
私人MediaRouteSelector mSelector ;
私人回调mMediaRouterCallback ;

// 您的应用程序可以使用它们,以便框架可以发现它们。
@Override
受保护的void onCreate ( Bundle savedInstanceState ) {
超级. onCreate ( savedInstanceState );
设置ContentView ( R.layout.activity_main ) ;​​

// 获取媒体路由器服务。
mMediaRouter
= MediaRouter.getInstance ( this ) ;​
...
}

// 在启动时添加回调来告诉媒体路由器有哪些类型的路由
// 您的应用程序可以使用它们,以便框架可以发现它们。
@Override
公共无效的onStart () {
mMediaRouter.addCallback
( mSelector , mMediaRouterCallback ,​​
媒体路由器.回调标志位 请求发现);
超级. onStart ();
}

// 停止时删除选择器,告诉媒体路由器它不再
// 需要发现您的应用的路线。
@Override
公共无效onStop () {
mMediaRouter.removeCallback
( mMediaRouterCallback ) ;​
超级. onStop ();
}
...
}


远程回放

这种方法将控制命令发送到辅助设备以启动播放并控制正在进行的播放(播放、停止、快进、倒带等)。当您的应用支持这种类型的媒体路由时,您必须使用通过应用的 MediaRouter.Callback 对象接收的远程播放 MediaRoute.RouteInfo 对象创建一个 RemotePlaybackClient 对象。

下面的示例代码演示了一个控制器方法,该方法创建一个新的远程播放客户端并向其发送视频进行播放。


私人无效更新远程播放器( RouteInfo路线) {
// 改变路线:拆除之前的客户端
如果( mRoute != null && mRemotePlaybackClient != null ) {
mRemotePlaybackClient
.释放();
mRemotePlaybackClient
=空;
}

// 保存新路线
mRoute
=路线;

// 附加新的播放客户端
mRemotePlaybackClient
=新的RemotePlaybackClient ( this , mRoute ) ;

// 发送文件进行播放
mRemotePlaybackClient.play
( Uri .​​解析(
“ http://archive.org/download/Sintel/sintel-2048-stereo_512kb.mp4 ” )
“video/mp4” , null , 0 , null , new ItemActionCallback () {

@Override
public void onResult (捆绑数据,字符串sessionId ,
MediaSessionStatus会话状态,
字符串itemId , MediaItemStatus itemStatus ) {
logStatus
( "播放:项目成功" + itemId );
}

@Override
public void onError (字符串错误, int代码, Bundle数据) {
logStatus
( "播放:失败 - 错误:" + code + " - " + error );
}
});
}
}


有关如何使用媒体路由器的更多信息,请访问developer.android.com

Tags (1)
No ratings
Version history
Last update:
‎11-19-2025 02:18 PM
Updated by: