首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用android应用程序检查miracast兼容设备

使用android应用程序检查miracast兼容设备
EN

Stack Overflow用户
提问于 2013-07-09 11:41:44
回答 1查看 4.2K关注 0票数 2

我如何在安卓系统中搜索与Miracast兼容的设备(可能正在使用WiFi Direct)?

我只是想知道Android4.2中的DisplayManager和演示类对演示文稿有帮助& miracast。但是有什么方法可以检查另一个设备是否与Miracast兼容/搜索Miracast接收器?

谢谢

史密莎

EN

回答 1

Stack Overflow用户

发布于 2013-08-29 07:32:33

android框架源代码展示了如何搜索miracast接收器设备。

基本使用WiFi直接设备搜索API,discoverPeers -> requestPeers -> isWifiDisplay和isPrimarySinkDeviceType

代码语言:javascript
复制
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;
}

scan

WifiP2pWfdInfo定义了四种设备类型,

代码语言:javascript
复制
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直接,也许我的应用程序是有用的使用wifi直接api。

http ://github.com/kensuke/WiFiDirectTestApp

添加: 2014/02/24 -解析用于识别Miracast设备源或Sink的toString输出字符串

wfd直接API () requestPeers()回调到onPeersAvailable(),该方法的参数WifiP2pDeviceList在P2p设备附近有一个WifiP2pDevice实例列表,WifiP2pDevice有一个设备wfd直接信息,包括Miracast信息(wfd.)而设备进入可以使用WifiP2pDevice.toString()方法。

搜索"WFD DeviceInfo: XXX“字符串,XXX是一个数值,蒙面"0x03”(见WifiP2pWfdInfo.java),蒙面后得到0-3。该值定义了源或接收器,请参见WifiP2pWfdInfo.java常量)。

代码语言:javascript
复制
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;

这种职责方式可以在非根设备上使用,一般应用程序。

WifiP2pDevice.toString()返回值的示例

“装置: ZTS1145

地址: 7a:e8:b6:f6:4d:74

主要型号: 10-0050F204-5

次要类型: null

主要用途wps: 392

主要雇员人数:0

电话会议: 33

(二)基本状况:3

已启用WFD : trueWFD DeviceInfo: 273

主要产品WFD CtrlPort: 7236

主要产品MaxThroughput: 10“

代码语言:javascript
复制
// 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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17547356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档