14

我正在尝试编写一个应用程序,该应用程序将开始通过 miracast 将屏幕从 Android 手机投射到电视上。我正在使用 HDMI 加密狗,因为有问题的电视本身不支持 Miracast。我一直在尝试这里的代码,但它需要一个应用程序 ID,我按照这些步骤获得了它。我的问题是,说明似乎表明我需要注册 miracast 加密狗,以便它可以与未发布的“调试”应用程序对话。但是,只提到了 Google Cast 设备,这与 miracast 的协议不同。我还需要注册加密狗吗?

有没有更简单的方法通过 Miracast 以编程方式投射到设备?要求是没有用户交互,所以我不能只显示一个投射按钮。

如果相关,我正在使用 Android 5.1。

编辑:经过进一步研究,我意识到 Google Cast 使用与 Miracast 完全不同的协议,因此所有关于注册加密狗的讨论都无关紧要。在 Android 中进行 Miracast 完全不需要注册。问题是 API 被隐藏,有关详细信息,请参阅下面的答案。

4

2 回答 2

12

所以这是可能的,但由于权限问题,仅适用于自定义版本的 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 通常会使保修失效。

于 2015-12-09T15:32:21.343 回答
0
try {
         startActivity(new Intent("android.settings.CAST_SETTINGS"));
         return;
     } catch (Exception exception1) {
         Toast.makeText(getApplicationContext(), "Device not supported", Toast.LENGTH_LONG).show();
     }

希望这会对您有所帮助,使用投射设置完成屏幕镜像,它使用您设备的投射服务。但你必须用相同的wifi连接设备和电视。

于 2019-02-14T04:50:39.770 回答