如何在服务的外部显示器上设置窗口?

时间:2014-03-21 13:32:57

标签: android

Android在API级别17(Android 4.2)中添加了Presentation,以支持在外部Display上显示内容,例如通过HDMI,MHL,Miracast或SlimPort连接的电视或显示器。但是,Presentation扩展了Dialog,因此只能从Activity使用。

据我所知,这就是故事的结尾。

但是,this StackOverflow answer提示可以通过DisplayServicecreateDisplayContext()使用来自WindowManager的外部Context { {1}}。然后,addView()上的WindowManager方法应该将View呈现在指定的Display上。如果能够实现这一点,它确实为外部显示器的有趣使用打开了大门,例如在电视上播放视频,同时能够在设备自己的触摸屏上使用不相关的应用程序(例如,Web浏览器)。 p>

但是,该答案掩盖了一个关键细节:如何为WindowManager.LayoutParams电话设置addView()。特别是,TYPE_字段有一系列令人眼花缭乱的type值。我已经两次尝试崩溃,但有不同的消息:

  • TYPE_APPLICATION会产生android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

  • TYPE_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的{​​{1}},该IPolicy很快就会以{{1}结尾}}。无论如何,SDK应用程序无权访问PolicyManager

是否有人从createDisplayContext()获得Service工作方法?如果是这样,您对type使用了什么(或者更常见的是,WindowManager.LayoutParams一般用于什么?对于不涉及某些icky权限的解决方案的奖励积分。 : - )

谢谢!

1 个答案:

答案 0 :(得分:6)

与SYSTEM_ALERT_WINDOW权限结合使用的TYPE_SYSTEM_ALERT类型应该可以正常工作。

从服务启动对话框是有意义的  需要" icky"权限,它基本上允许您绘制其他应用程序:)