以编程方式从 android 投射到 miracast 接收器的步骤
Steps to programmatically cast from android to miracast receiver
我正在尝试编写一个应用程序,它将开始通过 miracast 将屏幕从 Android phone 投射到电视上。我使用的是 HDMI 加密狗,因为有问题的电视本身不支持 miracast。我一直在尝试代码 here, but it needs an Application ID which I have got following these steps。我的问题是,说明似乎表明我需要注册 miracast 加密狗,这样它才能与未发布的 'debug' 应用程序通信。但是,只提到了 Google 个 Cast 设备,这与 miracast 不是同一个协议。我还需要注册加密狗吗?
是否有更简单的方法通过 miracast 以编程方式投射到设备?一个要求是没有用户交互,所以我不能只显示一个投射按钮。
如果相关的话,我正在使用 Android 5.1。
编辑:经过进一步研究,我意识到 Google Cast 使用与 Miracast 完全不同的协议,因此所有关于注册加密狗的讨论都是无关紧要的。在 Android 中执行 Miracast 完全不需要注册。问题是 API 被隐藏了,详情请看我下面的回答。
所以这是可能的,但由于权限问题仅适用于 Android 的自定义版本。
你需要使用什么
Google的WifiDisplay API makes it all possible. This file contains examples of how to use the API to cast the display. It appears的隐藏部分会在某个时候公开发布,虽然据我所知它仍然隐藏在API 23的最新主控中.
如何访问隐藏的API
要使用隐藏的 APIs,此 guide(mirror here) provides a good introduction. If you're using API 22+ however, then that guide won't work as the format of android.jar has changed and classes.dex has been split across multiple files. So this 建议在这种情况下更为准确。注意关于framework-classes2.dex
的后记也必须做;它不是可选的。
最新版本的dex2jar
工具无法将API 22 中的.dex 文件转换为jar。作者here提到了解决办法。我选择修补该工具而不是更改 dex,因为这对我不起作用。只需将作者提到的行从抛出 RuntimeException 更改为:
return TypeClass.INT;
如何获得使用隐藏的权限API
完成所有这些后,下一步就是为您的应用授予 CONFIGURE_WIFI_DISPLAY
权限。不幸的是,如您所见 here, it has system-level protection. This means that your app must be signed by the same key as the system to use this permission. So unless you have Google's private key, you can't have your app run on normal Android phones. My solution was to build a custom version of CyanogenMod(using this 指南),权限从 'system' 更改为 'normal'。这消除了签署任何文件的麻烦。我也为 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 phone 上安装 CyanogenMod 通常会使保修失效。
try {
startActivity(new Intent("android.settings.CAST_SETTINGS"));
return;
} catch (Exception exception1) {
Toast.makeText(getApplicationContext(), "Device not supported", Toast.LENGTH_LONG).show();
}
希望这对您有所帮助,使用投射设置完成屏幕镜像,它使用您设备的投射服务。但是你必须使用相同的 wifi 连接设备和电视。
我正在尝试编写一个应用程序,它将开始通过 miracast 将屏幕从 Android phone 投射到电视上。我使用的是 HDMI 加密狗,因为有问题的电视本身不支持 miracast。我一直在尝试代码 here, but it needs an Application ID which I have got following these steps。我的问题是,说明似乎表明我需要注册 miracast 加密狗,这样它才能与未发布的 'debug' 应用程序通信。但是,只提到了 Google 个 Cast 设备,这与 miracast 不是同一个协议。我还需要注册加密狗吗?
是否有更简单的方法通过 miracast 以编程方式投射到设备?一个要求是没有用户交互,所以我不能只显示一个投射按钮。
如果相关的话,我正在使用 Android 5.1。
编辑:经过进一步研究,我意识到 Google Cast 使用与 Miracast 完全不同的协议,因此所有关于注册加密狗的讨论都是无关紧要的。在 Android 中执行 Miracast 完全不需要注册。问题是 API 被隐藏了,详情请看我下面的回答。
所以这是可能的,但由于权限问题仅适用于 Android 的自定义版本。
你需要使用什么
Google的WifiDisplay API makes it all possible. This file contains examples of how to use the API to cast the display. It appears的隐藏部分会在某个时候公开发布,虽然据我所知它仍然隐藏在API 23的最新主控中.
如何访问隐藏的API
要使用隐藏的 APIs,此 guide(mirror here) provides a good introduction. If you're using API 22+ however, then that guide won't work as the format of android.jar has changed and classes.dex has been split across multiple files. So this 建议在这种情况下更为准确。注意关于framework-classes2.dex
的后记也必须做;它不是可选的。
最新版本的dex2jar
工具无法将API 22 中的.dex 文件转换为jar。作者here提到了解决办法。我选择修补该工具而不是更改 dex,因为这对我不起作用。只需将作者提到的行从抛出 RuntimeException 更改为:
return TypeClass.INT;
如何获得使用隐藏的权限API
完成所有这些后,下一步就是为您的应用授予 CONFIGURE_WIFI_DISPLAY
权限。不幸的是,如您所见 here, it has system-level protection. This means that your app must be signed by the same key as the system to use this permission. So unless you have Google's private key, you can't have your app run on normal Android phones. My solution was to build a custom version of CyanogenMod(using this 指南),权限从 'system' 更改为 'normal'。这消除了签署任何文件的麻烦。我也为 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 phone 上安装 CyanogenMod 通常会使保修失效。
try {
startActivity(new Intent("android.settings.CAST_SETTINGS"));
return;
} catch (Exception exception1) {
Toast.makeText(getApplicationContext(), "Device not supported", Toast.LENGTH_LONG).show();
}
希望这对您有所帮助,使用投射设置完成屏幕镜像,它使用您设备的投射服务。但是你必须使用相同的 wifi 连接设备和电视。