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

标签 android casting google-cast wifi-direct miracast

我正在尝试编写一个应用程序,该应用程序将开始通过 miracast 将屏幕从 Android 手机转换到电视上。我使用的是 HDMI 加密狗,因为有问题的电视本身不支持 miracast。我一直在尝试代码 here , 但它需要一个我在 these steps 之后得到的应用程序 ID .我的问题是,说明似乎表明我需要注册 miracast 加密狗,以便它与未发布的“调试”应用程序通信。但是,只提到了 Google Cast 设备,这与 miracast 不是同一个协议(protocol)。我还需要注册加密狗吗?

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

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

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

最佳答案

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

你需要使用什么

WifiDisplay API 的隐藏部分使这一切成为可能。这file包含如何使用 API 转换显示的示例。它appears Google 会在某个时候公开发布它,尽管据我所知它仍然隐藏在 API 23 的最新版本中。

如何访问隐藏的 API

要使用隐藏的 API,这 guide ( mirror here ) 提供了很好的介绍。但是,如果您使用的是 API 22+,那么该指南将不起作用,因为 android.jar 的格式已更改并且 classes.dex 已拆分为多个文件。所以this在这种情况下,建议更准确。注意关于framework-classes2.dex的postscript must也要做;它不是可选的。

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

return TypeClass.INT;

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

完成所有这些后,下一步就是为您的应用授予 CONFIGURE_WIFI_DISPLAY 权限。不幸的是,如您所见here ,它具有系统级保护。这意味着您的应用必须由与系统相同的 key 签名才能使用此权限。因此,除非您拥有 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 通常会使保修失效。

关于android - 以编程方式从 android 转换到 miracast 接收器的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828968/

相关文章:

android - Meteor Cordova 热代码插入应用程序大小限制? (和其他差距)

postgresql - 有没有办法在 Postgres 中禁用函数重载

c++ - 允许将 (double *) 转换为 (double **) 吗?

smooth-streaming - 如何在 Chromecast 中播放流畅的流媒体视频?

Android:我无法拥有 ViewPager WRAP_CONTENT

android - Android Dex 中的 64K 方法限制是否也包括 Private 和 Protected?

c - 算术和强制转换指针和结构

android - 后退按钮在 CastCompanionLibrary 的 VideoCastControllerAcitivity 中不起作用

java - 从 windows-1256 转换为 UTF-8 会导致标点符号问题

java - DialogListener 的 startActivity 导致应用程序崩溃