我正在尝试编写一个应用,该应用将开始通过miracast将屏幕从Android手机投射到电视。由于问题电视本身不支持Miracast,因此我使用的是HDMI加密狗。我一直在尝试代码here,但它需要一个在these steps之后得到的应用程序ID。我的问题是,说明似乎表明我需要注册Miracast软件狗,这样它才能与未发布的“调试”应用程序对话。但是,仅提及Google Cast设备,并且该协议与Miracast不同。我还需要注册加密狗吗?
是否有更简单的方法通过miracast以编程方式投射到设备?要求是没有用户交互,所以我不能只显示投射按钮。
如果相关,我正在使用Android 5.1。
EDIT:经过进一步研究,我意识到Google Cast使用与Miracast完全不同的协议,因此有关加密狗注册的所有讨论都是无关紧要的。无需注册即可在Android中进行Miracast。问题是该API被隐藏,请参阅下面的详细信息。
因此可行,但由于权限问题,仅在自定义版本的Android上。
您需要使用什么
WifiDisplay API的隐藏部分使这一切成为可能。 file包含有关如何使用API投射显示内容的示例。appearsGoogle会在某个时候公开发布它,尽管据我所知它仍隐藏在最新的API 23主版本中。
如何访问隐藏的API
要使用隐藏的API,此guide(mirror here)提供了很好的介绍。但是,如果您使用的是API 22+,则该指南将无效,因为android.jar的格式已更改,并且classes.dex已拆分为多个文件。因此,在这种情况下,this建议更为准确。注意,关于framework-classes2.dex
必须的后记也已完成;它不是可选的。
dex2jar
工具的最新版本无法将API 22中的.dex文件转换为jar。作者here提到了该解决方案。我选择修补该工具而不是更改dex,因为这对我不起作用。只需将作者提到的行从抛出RuntimeException更改为:
return TypeClass.INT;
如何获得使用隐藏的API的权限
一旦完成,下一步就是为您的应用授予CONFIGURE_WIFI_DISPLAY
权限。不幸的是,您可以看到here,它具有系统级保护。这意味着您的应用必须使用与系统相同的密钥签名才能使用此权限。因此,除非您拥有Google的私钥,否则您的应用程序无法在普通的Android手机上运行。我的解决方案是构建一个自定义版本的CyanogenMod(使用this指南),并将权限从“系统”更改为“普通”。这消除了麻烦签署任何东西。对于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通常会使保修无效。
try {
startActivity(new Intent("android.settings.CAST_SETTINGS"));
return;
} catch (Exception exception1) {
Toast.makeText(getApplicationContext(), "Device not supported", Toast.LENGTH_LONG).show();
}
hope this will help you, done screen mirroring with the cast settings, it uses your device's cast service. but you have to connect with same wifi both device and tv