【发布时间】:2014-03-21 13:32:57
【问题描述】:
Android 在 API 级别 17 (Android 4.2) 中添加了Presentation,以支持在外部Display 上显示内容,例如通过 HDMI、MHL、Miracast 或 SlimPort 连接的电视或显示器。但是,Presentation 扩展了 Dialog,因此它只能在 Activity 中使用。
据我所知,这就是故事的结局。
但是,this StackOverflow answer 暗示了一种可能的方法,即通过从 Context 创建的 createDisplayContext() 和 WindowManager 从 Service 使用外部 Display。然后,该WindowManager 上的addView() 方法应将View 渲染到指示的Display 上。如果这可以发挥作用,它确实为外部显示器的有趣用途打开了大门,例如在电视上播放视频,同时能够在设备自己的触摸屏上使用不相关的应用程序(例如,网络浏览器)。
但是,这个答案掩盖了一个关键细节:如何为addView() 调用设置WindowManager.LayoutParams。特别是,type 字段可能有一系列令人眼花缭乱的TYPE_ 值。我曾两次尝试崩溃,但消息不同:
TYPE_APPLICATION导致android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an applicationTYPE_APPLICATION_MEDIA导致android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
例如,对于上述第二种情况,这是我的WindowManager.LayoutParams:
WindowManager.LayoutParams p=
new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
0,
0,
WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA,
0, PixelFormat.OPAQUE);
通读the docs for type 表明TYPE_APPLICATION 中没有一个是正确的,因为我没有token。此外,这个练习的目的是没有有token,至少据我所知,Service 应该独立于任何 UI 运行。
如果您查看Presentation 的源代码,它会将WindowManager 的工作推迟到Dialog,它使用com.android.internal.policy.PolicyManager,很快就会在IPolicy 中陷入死胡同。无论如何,SDK 应用无权访问PolicyManager。
有没有人从Service 获得createDisplayContext() 的工作方式?如果是这样,您对type 使用了什么(或者更一般地说,对于WindowManager.LayoutParams)?不涉及一些讨厌的许可的解决方案的奖励积分。 :-)
谢谢!
【问题讨论】:
标签: android