Android在API级别17(Android 4.2)中添加了Presentation
,以支持在外部Display
上显示内容,例如通过HDMI,MHL,Miracast或SlimPort连接的电视或显示器。但是,Presentation
扩展了Dialog
,因此只能从Activity
使用。
据我所知,这就是故事的结尾。
但是,this StackOverflow answer提示可以通过Display
和Service
从createDisplayContext()
使用来自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权限的解决方案的奖励积分。 : - )
谢谢!
答案 0 :(得分:6)
与SYSTEM_ALERT_WINDOW权限结合使用的TYPE_SYSTEM_ALERT类型应该可以正常工作。
从服务启动对话框是有意义的 需要" icky"权限,它基本上允许您绘制其他应用程序:)