所以这是可能的,但由于权限问题,仅适用于自定义版本的 Android。
你需要使用什么
WifiDisplay API的隐藏部分使这一切成为可能。此文件包含有关如何使用 API 投射显示的示例。谷歌似乎会在某个时候公开发布它,尽管据我所知它仍然隐藏在最新的 API 23 大师中。
如何访问隐藏的 API
要使用隐藏的 API,本指南(此处为镜像)提供了很好的介绍。但是,如果您使用的是 API 22+,那么该指南将不起作用,因为 android.jar 的格式已更改并且 classes.dex 已被拆分为多个文件。所以这个建议在这种情况下更准确。注意后记about也framework-classes2.dex
必须做;这不是可选的。
该dex2jar
工具的最新版本无法将 API 22 中的 .dex 文件转换为 jar。作者在这里提到了解决方案。我选择修补工具而不是更改 dex,因为这对我不起作用。只需将作者提到的行从抛出 RuntimeException 更改为:
return TypeClass.INT;
如何获得使用隐藏 API 的权限
完成后,下一步就是为您的应用CONFIGURE_WIFI_DISPLAY
授予权限。不幸的是,正如您在此处看到的,它具有系统级保护。这意味着您的应用必须使用与系统相同的密钥签名才能使用此权限。因此,除非您拥有 Google 的私钥,否则您的应用程序无法在普通的 Android 手机上运行。我的解决方案是构建 CyanogenMod 的自定义版本(使用本指南),权限从“系统”更改为“正常”。这消除了签署任何东西的麻烦。我也为CONTROL_WIFI_DISPLAY
许可做了同样的事情。虽然我不完全确定这是必要的,但它并没有什么坏处。这两个权限都位于frameworks/base/core/res/AndroidManifest.xml
. 将第 2161-2169 行从:
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
android:protectionLevel="signature" />
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
android:protectionLevel="signature" />
至:
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
android:protectionLevel="normal" />
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
android:protectionLevel="normal" />
然后像往常一样构建 CyanogenMod。我可以确认这确实有效,但这会将您的应用程序限制为在安装了此自定义版本的 CyanogenMod 的设备上运行。此外,在 Android 手机上安装 CyanogenMod 通常会使保修失效。