Cal*_*all 8 android casting wifi-direct google-cast miracast
我正在尝试编写一个应用程序,它将开始通过miracast将屏幕从Android手机投射到电视上.我正在使用HDMI加密狗,因为有问题的电视本身并不支持miracast.我一直在尝试这里的代码,但它需要一个我遵循这些步骤的应用程序ID .我的问题是,说明似乎表明我需要注册miracast加密狗,以便它与未发布的'debug'应用程序进行通信.但是,仅提及Google Cast设备,这与miracast的协议不同.我还需要注册加密狗吗?
有没有更简单的方式通过miracast以编程方式投射到设备?要求是没有用户交互,所以我不能只显示一个强制转换按钮.
我正在使用Android 5.1,如果这是相关的.
编辑:经过进一步的研究,我意识到Google Cast使用了与Miracast完全不同的协议,因此所有关于注册加密狗的讨论都是无关紧要的.Android中的Miracast根本不需要注册.问题是隐藏了API,请参阅下面的答案以获取详细信息.
所以这是可能的,但仅限于Android的自定义版本,因为权限问题.
你需要使用什么
WifiDisplay API的隐藏部分使一切成为可能.此文件包含如何使用API转换显示的示例.这看起来,谷歌将公开发布它在某些时候,虽然它仍然隐藏在API 23的最新主,据我可以看到.
如何访问隐藏的API
要使用隐藏的API,本指南提供了一个很好的介绍.如果您正在使用API 22+,那么该指南将无法正常工作,因为android.jar的格式已更改且classes.dex已拆分为多个文件.所以这个建议在这种情况下更准确.需要注意的是,大约后记framework-classes2.dex 必须同时进行; 它不是可选的.
该dex2jar工具的最新版本无法将.dex文件从API 22转换为jar.作者在这里提到了解决方案.我选择修改工具而不是更改dex,因为这对我不起作用.只需更改作者提到的将RuntimeException抛出的行:
return TypeClass.INT;
Run Code Online (Sandbox Code Playgroud)
如何获得使用隐藏API的权限
完成所有操作后,下一步就是为您的应用CONFIGURE_WIFI_DISPLAY授予权限.不幸的是,正如您在此处所看到的,它具有系统级保护.这意味着您的应用必须使用与系统相同的密钥进行签名才能使用此权限.因此,除非您拥有Google的私钥,否则您无法在普通Android手机上运行您的应用.我的解决方案是构建CyanogenMod的自定义版本(使用本指南),权限从"system"更改为"normal".这样就不需要为签署任何东西而烦恼.我也做了同样的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" />
Run Code Online (Sandbox Code Playgroud)
至:
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
android:protectionLevel="normal" />
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
android:protectionLevel="normal" />
Run Code Online (Sandbox Code Playgroud)
然后正常构建CyanogenMod.我可以确认这确实有效,但这限制了您的应用程序在安装了此自定义版本的CyanogenMod的设备上运行.此外,在Android手机上安装CyanogenMod通常会使保修失效.