以编程方式从android转换为Miracast接收器的步骤

问题描述 投票:8回答:2

我正在尝试编写一个应用,该应用将开始通过miracast将屏幕从Android手机投射到电视。由于问题电视本身不支持Miracast,因此我使用的是HDMI加密狗。我一直在尝试代码here,但它需要一个在these steps之后得到的应用程序ID。我的问题是,说明似乎表明我需要注册Miracast软件狗,这样它才能与未发布的“调试”应用程序对话。但是,仅提及Google Cast设备,并且该协议与Miracast不同。我还需要注册加密狗吗?

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

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

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

android casting google-cast wifi-direct miracast
2个回答
9
投票

因此可行,但由于权限问题,仅在自定义版本的Android上。

您需要使用什么

WifiDisplay API的隐藏部分使这一切成为可能。 file包含有关如何使用API​​投射显示内容的示例。appearsGoogle会在某个时候公开发布它,尽管据我所知它仍隐藏在最新的API 23主版本中。

如何访问隐藏的API

要使用隐藏的API,此guidemirror 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通常会使保修无效。


0
投票
 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
© www.soinside.com 2019 - 2024. All rights reserved.