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

时间:2015-11-20 14:19:59

标签: android casting google-cast wifi-direct miracast

我正在尝试编写一个应用程序,它将开始通过miracast将屏幕从Android手机投射到电视上。我正在使用HDMI加密狗,因为有问题的电视本身并不支持miracast。我一直在尝试代码here,但它需要一个我跟在these steps后面的应用程序ID。我的问题是,说明似乎表明我需要注册miracast加密狗,以便它与未发布的'debug'应用程序进行通信。但是,仅提及Google Cast设备,这与miracast的协议不同。我还需要注册加密狗吗?

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

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

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

2 个答案:

答案 0 :(得分:9)

所以这是可能的,但仅限于Android的自定义版本,因为权限问题。

您需要使用的内容

WifiDisplay API的隐藏部分使一切成为可能。此file包含如何使用API​​投射显示的示例。谷歌会在某个时候公开发布它appears,尽管我可以看到它仍然隐藏在最新的API 23大师中。

如何访问隐藏的API

要使用隐藏的API,这个guide提供了一个很好的介绍。但是,如果您正在使用API​​ 22+,则该指南不会起作用,因为android.jar的格式已更改且classes.dex已拆分为多个文件。因此this建议在这种情况下更准确。请注意,关于framework-classes2.dex 的附言必须也必须完成;它不是可选的。

最新版本的dex2jar工具无法将.dex文件从API 22转换为jar。作者here提到了解决方案。我选择修改工具而不是更改dex,因为这对我没用。只需将作者提到的行改为抛出RuntimeException:

return TypeClass.INT;

如何获得使用隐藏API的权限

完成所有操作后,下一步就是为您的应用授予CONFIGURE_WIFI_DISPLAY权限。不幸的是,正如您可以看到here,它具有系统级保护。这意味着您的应用必须使用与系统相同的密钥进行签名才能使用此权限。因此,除非您拥有Google的私钥,否则您无法在普通Android手机上运行您的应用。我的解决方案是构建一个CyanogenMod的自定义版本(使用this指南),权限已从' system'正常'。这样就不需要为签署任何东西而烦恼。我也对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通常会使保修失效。

答案 1 :(得分: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