【问题标题】:Getting WiFi Direct IP address of my device获取我设备的 WiFi Direct IP 地址
【发布时间】:2013-12-14 08:23:30
【问题描述】:

我正在尝试获取我的设备的 IP 地址,但一切都是徒劳的,没有成功。我试过了

public String getP2PIpAddr() {
       WifiManager wifiManager = (WifiManager) getSystemService(WIFI_P2P_SERVICE);
       WifiInfo wifiInfo = wifiManager.getConnectionInfo();
       int ip = wifiInfo.getIpAddress();

       String ipString = String.format(
       "%d.%d.%d.%d",
       (ip & 0xff),
       (ip >> 8 & 0xff),
       (ip >> 16 & 0xff),
       (ip >> 24 & 0xff));

       return ipString;
    }

但它给了我 0.0.0.0 并且没有其他方法也有效..帮助!!

【问题讨论】:

  • 当您需要WifiManager 时,为什么要将WIFI_P2P_SERVICE 传递给getSystemService()?你不应该传递Context.WIFI_SERVICE吗?
  • @user2558882 几乎是一样的。但它不会帮助我获得 wifi Direct IP。
  • 尝试使用WifiP2PManager 而不是WifiManager
  • @hichris123 它也不起作用。

标签: java android ip wifi-direct


【解决方案1】:

仅供参考:我是WiFi-Shoot (a direct file transfer app via WiFi Direct)的开发者。

很遗憾,没有办法获取自己的IP地址,一般操作原理略有不同:

  • 所有操作都将使用WiFiP2PManager
  • 调用initialize获取Channel,其他操作都需要这个Channel。
  • 在您 discoverPeersconnect 到其中之一之后
  • 您可以requestGroupInfo 告诉您该设备是否是群组所有者以及群组所有者的 IP 地址是什么。因此,非所有者可以使用提供的地址连接到所有者,并且所有者将监听连接。
  • 您也可以requestPeers 为您提供所有已连接对等方的列表。其中包括 MAC 地址和名称。

拨打Context.getSystemService(Context.WIFI_P2P_SERVICE)会给你一个WiFiP2PManager。

是的,您需要大量 WiFI 权限,例如 ACCESS_WIFI_STATECHANGE_WIFI_STATE 等。

【讨论】:

  • 这意味着你在android P2P 工作过,我有几个问题,如果你需要帮助,请给我你的电子邮件地址或facebook 地址吗?
  • requestGroupInfo 没有给你 IP 地址
  • 当非所有者连接到所有者时,所有者可以获得连接的地址并可以使用或发送给非所有者
【解决方案2】:

将peer的本地IP地址(以192.168.x.x开头)发送给群主。在这个并不需要时间的“握手”之后,一切都很好。没有找到其他方法获取peer的ip地址,GroupListener/PeerListener/...提供的唯一信息就是mac地址。

【讨论】:

  • 请进一步解释。
  • 这没有回答问题——OP 想知道如何获取自己的 IP 地址,而不是如何通知 GO 已知 IP 地址。关键是我们不知道从哪里得到 192.168.x.x!
【解决方案3】:
public static String getIpAddress() {
    try {
        List<NetworkInterface> interfaces = Collections
                .list(NetworkInterface.getNetworkInterfaces());
        /*
         * for (NetworkInterface networkInterface : interfaces) { Log.v(TAG,
         * "interface name " + networkInterface.getName() + "mac = " +
         * getMACAddress(networkInterface.getName())); }
         */

        for (NetworkInterface intf : interfaces) {
            if (!getMACAddress(intf.getName()).equalsIgnoreCase(
                    Globals.thisDeviceAddress)) {
                // Log.v(TAG, "ignore the interface " + intf.getName());
                // continue;
            }
            if (!intf.getName().contains("p2p"))
                continue;

            Log.v(TAG,
                    intf.getName() + "   " + getMACAddress(intf.getName()));

            List<InetAddress> addrs = Collections.list(intf
                    .getInetAddresses());

            for (InetAddress addr : addrs) {
                // Log.v(TAG, "inside");

                if (!addr.isLoopbackAddress()) {
                    // Log.v(TAG, "isnt loopback");
                    String sAddr = addr.getHostAddress().toUpperCase();
                    Log.v(TAG, "ip=" + sAddr);

                    boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);

                    if (isIPv4) {
                        if (sAddr.contains("192.168.49.")) {
                            Log.v(TAG, "ip = " + sAddr);
                            return sAddr;
                        }
                    }

                }

            }
        }

    } catch (Exception ex) {
        Log.v(TAG, "error in parsing");
    } // for now eat exceptions
    Log.v(TAG, "returning empty ip address");
    return "";
}

public static String getMACAddress(String interfaceName) {
        try {
            List<NetworkInterface> interfaces = Collections
                    .list(NetworkInterface.getNetworkInterfaces());

            for (NetworkInterface intf : interfaces) {
                if (interfaceName != null) {
                    if (!intf.getName().equalsIgnoreCase(interfaceName))
                        continue;
                }
                byte[] mac = intf.getHardwareAddress();
                if (mac == null)
                    return "";
                StringBuilder buf = new StringBuilder();
                for (int idx = 0; idx < mac.length; idx++)
                    buf.append(String.format("%02X:", mac[idx]));
                if (buf.length() > 0)
                    buf.deleteCharAt(buf.length() - 1);
                return buf.toString();
            }
        } catch (Exception ex) {
        } // for now eat exceptions
        return "";
        /*
         * try { // this is so Linux hack return
         * loadFileAsString("/sys/class/net/" +interfaceName +
         * "/address").toUpperCase().trim(); } catch (IOException ex) { return
         * null; }
         */
    }

【讨论】:

  • 在 API 级别 23 中,不推荐使用 InetAddressUtils。所以检查 (inetAddress instanceof Inet4Address) 而不是 InetAddressUtils.isIPv4Address(sAddr)
【解决方案4】:

您对附加到您的 Android 程序清单的 WiFi 设置有权限吗?至少需要ACCESS_WIFI_STATE [1]。如果这还不够,可能还需要ACCESS_NETWORK_STATE [2]。我没有发现您的代码有任何问题,因此我的建议是尝试使用 Manifest。

我作为来源的第一个链接在接受的答案中也有INTERNET 权限,这样您的程序也可以联系某处以请求连接,从而请求 IP。如果这两个第一个不起作用,那将是下一个尝试的权限。

您询问了官方或可靠来源,这些来自可靠的来源。每一个信息和平至少在 Stackoverflow 上被投票一次,如果有人说这些东西至少对某人有用。

我的来源:

[1]How to get IP address of the device from code?

[2]Android WifiManager getConnectionInfo requires CHANGE_WIFI_STATE?

【讨论】:

    【解决方案5】:

    如果您正在尝试获取连接到 WiFi 网络的其他设备的 IP 地址

    try {
                Address = InetAddress.getLocalHost();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    
            System.out.println(Address);
    

    获取 Internet IP 地址,即实时 IP 地址

    String myUrl = "http://api.externalip.net/ip";
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(myUrl);
    
            try{
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity ht = httpResponse.getEntity();
                BufferedHttpEntity buf = new BufferedHttpEntity(ht);
                InputStream is = buf.getContent();
                BufferedReader r = new BufferedReader(new InputStreamReader(is));
                StringBuilder total = new StringBuilder();
                String ipaddress = r.readLine();
                Toast.makeText(getApplicationContext(),"Live IP : " + ipaddress, Toast.LENGTH_LONG).show();
            }catch(Exception e){
                e.printStackTrace();
            }
    

    获取更深入的知识和其他原生方法的休闲链接

    http://developer.android.com/guide/topics/connectivity/wifip2p.html

    【讨论】:

      【解决方案6】:

      首先,检查清单文件的权限:

      <uses-permission
          android:required="true"
          android:name="android.permission.ACCESS_WIFI_STATE"/>
      <uses-permission
          android:required="true"
          android:name="android.permission.CHANGE_WIFI_STATE"/>
      <uses-permission
          android:required="true"
          android:name="android.permission.INTERNET"/>
      

      然后,定义 IP 查找的内容。如果您想广播该 IP 以用于服务发现之外的目的,请使用 WIFI_SERVICE 找到它。如果你对你的服务广播的 ip 地址感到好奇,NsdServiceInfo 实例有 getHost() 方法。

      【讨论】:

        【解决方案7】:

        使用此代码

        WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
        int ip = wifiInfo.getIpAddress();
        String ipAddress = Formatter.formatIpAddress(ip); 
        

        并将权限添加到您的清单中。

        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        

        【讨论】:

        • 此代码将提供来自 wifi 路由器的 wifi ip 地址。我正在寻找获取 wifi-direct ip 地址的代码。
        猜你喜欢
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 2020-09-14
        • 1970-01-01
        • 2012-04-20
        相关资源
        最近更新 更多