- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 Android 中搜索 Miracast 兼容设备(可能正在使用 WiFi Direct)?
我刚刚了解到 Android 4.2 中的 DisplayManager 和 Presentation 类有助于演示和 miracast。但是有什么方法可以检查其他设备是否与 Miracast 兼容/搜索 Miracast 接收器?
谢谢
史密莎
最佳答案
android 框架源代码显示了如何搜索 miracast 接收设备。
基本上使用 WiFi Direct 设备搜索 API,discoverPeers -> requestPeers -> isWifiDisplay & isPrimarySinkDeviceType
private static boolean isWifiDisplay(WifiP2pDevice device) {
return device.wfdInfo != null
&& device.wfdInfo.isWfdEnabled()
&& isPrimarySinkDeviceType(device.wfdInfo.getDeviceType());
}
private static boolean isPrimarySinkDeviceType(int deviceType) {
return deviceType == WifiP2pWfdInfo.PRIMARY_SINK
|| deviceType == WifiP2pWfdInfo.SOURCE_OR_PRIMARY_SINK;
}
https://github.com/kensuke/How-to-Miracast-on-AOSP/wiki/wfd_scan
WifiP2pWfdInfo定义了四种设备类型,
public static final int WFD_SOURCE = 0;
public static final int PRIMARY_SINK = 1;
public static final int SECONDARY_SINK = 2;
public static final int SOURCE_OR_PRIMARY_SINK = 3;
http s://android.googlesource.com/platform/frameworks/base/+/master/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
如果您不熟悉 wifi direct,也许我的应用程序对使用 wifi direct api 很有用。
http s://github.com/kensuke/WiFiDirectTestApp
添加:2014/02/24 - 解析 toString 输出字符串以识别 Miracast 设备源或接收器
Wi-Fi Direct API requestPeers()回调到onPeersAvailable(),该方法的参数WifiP2pDeviceList有附近的P2p设备,是WifiP2pDevice实例列表,WifiP2pDevice有一个设备Wi-fi Direct信息包括Miracast信息(wfd.. ) 和设备 into can get 使用 WifiP2pDevice.toString() 方法。
搜索“WFD DeviceInfo: XXX”字符串,XXX为数值,屏蔽为“0x03”(见WifiP2pWfdInfo.java),屏蔽后为0-3。该值定义了 SOURCE 或 SINK,请参阅 WifiP2pWfdInfo.java 常量)。
private static final int WFD_SOURCE = 0;
private static final int PRIMARY_SINK = 1;
private static final int SECONDARY_SINK = 2;
private static final int SOURCE_OR_PRIMARY_SINK = 3;
这种非常有责任的方式可以在非 root 设备、一般应用程序上使用。
WifiP2pDevice.toString() 返回值示例
"设备:ZTS1145
设备地址:7a:e8:b6:f6:4d:74
初级型号:10-0050F204-5
辅助类型:空
wps: 392
grpcapab: 0
开发能力:33
状态:3
wfdInfo: WFD 启用: trueWFD DeviceInfo: 273
WFD 控制端口:7236
WFD 最大吞吐量:10 英寸
// callback method of requestPeers();
public void onPeersAvailable(WifiP2pDeviceList peers) {
List<WifiP2pDevice> devs = new ArrayList<WifiP2pDevice>(peers.getDeviceList());
for (int i = 0; i < devs.size(); i++) {
WifiP2pDevice dev = devs.get(i);
boolean src = isWifiDisplaySource(dev);
boolean sink = isWifiDisplaySink(dev);
Log.d(TAG, dev.deviceName + " isSource[" + src + "] isSink[" + sink + "]");
}
}
private static final int WFD_DISABLED = -1;
private static final int WFD_SOURCE = 0;
private static final int PRIMARY_SINK = 1;
private static final int SECONDARY_SINK = 2;
private static final int SOURCE_OR_PRIMARY_SINK = 3;
private static final int DEVICE_TYPE = 0x3;
private int getWFDDeviceInfoFromString(String devStr) {
if (devStr == null) {
return WFD_DISABLED;
}
boolean wfd = false;
for (String line : devStr.split("\n")) {
// start self parsing...
// TODO: sprintf parse is more easy
// search "WFD enabled: [true|false]"
if (!line.matches(".*WFD enabled:.*")) {
continue;
}
String[] tokens = line.split(":");
int toks = tokens.length;
for (int i = 0; i < toks - 1; i++) {
if (!tokens[i].contains("WFD enabled")) {
continue;
}
String tok = tokens[i + 1].replaceAll("\\s", ""); // delete white space
if (tok.startsWith("true")) {
wfd = true;
break;
}
// why didn't use .equals() instead of .contains() and .startsWith() ? because
// 1) "wfdInfo: WFD enabled: trueWFD DeviceInfo: 273" // inputed string
// 2) "(wfdInfo):( WFD enabled):( trueWFD DeviceInfo):( 273)" // : splited string
// 3) "( trueWFD DeviceInfo)" => "trueWFD DeviceInfo" // white space deleted
}
}
if (!wfd) {
return WFD_DISABLED;
}
for (String line : devStr.split("\n")) {
// search "WFD DeviceInfo: \d+"
if (!line.matches(".*WFD DeviceInfo:.*")) {
continue;
}
String[] tokens = line.split(":");
int toks = tokens.length;
for (int i = 0; i < toks - 1; i++) {
if (!tokens[i].contains("WFD DeviceInfo")) {
continue;
}
String tok = tokens[i + 1].replaceAll("\\s", "");
int deviceInfo = Integer.parseInt(tok);
Log.d(TAG, "line[" + line + "] DeviceInfo[" + deviceInfo + "] masked[" + (deviceInfo & DEVICE_TYPE) + "]");
return deviceInfo;
}
}
return WFD_DISABLED;
}
private boolean isWifiDisplaySource(WifiP2pDevice dev) {
if (dev == null) {
return false;
}
int deviceInfo = getWFDDeviceInfoFromString(dev.toString());
if (deviceInfo == WFD_DISABLED) {
return false;
}
int deviceType = deviceInfo & DEVICE_TYPE; // masked
return deviceType == WFD_SOURCE || deviceType == SOURCE_OR_PRIMARY_SINK;
}
private boolean isWifiDisplaySink(WifiP2pDevice dev) {
if (dev == null) {
return false;
}
int deviceInfo = getWFDDeviceInfoFromString(dev.toString());
if (deviceInfo == WFD_DISABLED) {
return false;
}
int deviceType = deviceInfo & DEVICE_TYPE; // masked
return deviceType == PRIMARY_SINK || deviceType == SOURCE_OR_PRIMARY_SINK;
}
关于android - 使用 android 应用程序检查 miracast 兼容设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17547356/
我想为 Mac OS X 开发一个 Miracast 应用程序。(即向支持 miracast 的设备显示图像的东西)我现在遇到的唯一问题是我找不到官方规范。 是否有可能需要成为wi-fi联盟的成员才能
我正在研究 Miracast 协议(protocol)。目前在网络上,我找不到关于此协议(protocol)的明确规范(因此我可以使用它来发送和接收来自支持 Miracast 的程序的信号)。 我看到
我知道 Miracast(点对点无线截屏标准)使用 wifi-direct 而 Mirrorlink 没有。 Miracast 适用于任何两个设备(具有 wifi-direct),而 Mirrorli
我正在尝试构建一个 Android 应用程序,用于扫描本地 Miracast 连接并连接到它们以自动镜像屏幕。我还希望能够保存用户之前已经连接过的连接,并为他们提供昵称,以便用户可以更轻松地识别他们。
如何在 Android 中搜索 Miracast 兼容设备(可能正在使用 WiFi Direct)? 我刚刚了解到 Android 4.2 中的 DisplayManager 和 Presentati
我正在尝试编写一个应用程序,该应用程序将开始通过 miracast 将屏幕从 Android 手机转换到电视上。我使用的是 HDMI 加密狗,因为有问题的电视本身不支持 miracast。我一直在尝试
这些协议(protocol)是由 Wifi 联盟制定的。在我搜索和研究之后,我仍然无法清楚地区分这两个术语的概念:Miracast 和 Wifi-Direct。据我所知,在 StackOverFlow
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我是一名优秀的程序员,十分优秀!