获取我设备的WiFi Direct IP地址

9

我一直在尝试获取我的设备的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,而且其他方法也不起作用...求助!!


你看过 https://dev59.com/l2025IYBdhLWcg3wVkif 吗? - NigelK
当您需要一个 WifiManager 时,为什么要向 getSystemService() 传递 WIFI_P2P_SERVICE?难道不应该传递 Context.WIFI_SERVICE 吗? - Vikram
@user2558882,这几乎是相同的事情。但它不能帮助我获取WiFi Direct IP。 - Talib
尝试使用WifiP2PManager而不是WifiManager - hichris123
@hichris123 它也不起作用。 - Talib
7个回答

12

仅供参考:我是WiFi-Shoot(一款通过WiFi Direct进行直接文件传输的应用程序)的开发者。

不幸的是,没有办法获取自己的IP地址,并且操作的一般原则略有不同:

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

调用Context.getSystemService(Context.WIFI_P2P_SERVICE)将为您提供一个WiFiP2PManager。

是的,您将需要一堆WiFI权限,例如ACCESS_WIFI_STATECHANGE_WIFI_STATE等。


你在Android P2P方面有经验,我有几个问题想问,你能否给我你的电子邮件地址或Facebook地址,如果你愿意帮忙的话? - Talib
requestGroupInfo 不会提供给您一个 IP 地址。 - trampster
当非所有者连接到所有者时,所有者可以获取连接的地址并使用它或将其发送给非所有者。 - xuiqzy

7

向群组所有者发送对等方的本地IP地址(以192.168.x.x开头)。在这个“握手”之后,一切都可以顺利进行。没有找到其他获取对等方IP地址的方法,GroupListener / PeerListener / ...提供的唯一信息是MAC地址。


4
请进一步解释。 - user1850484
2
这并没有回答问题 - OP 想知道如何获得自己的 IP 地址,而不是如何通知 GO 已知的 IP 地址。关键是我们不知道从哪里获取 192.168.x.x! - CodingLumis

4
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)。 - Khushbu Shah

0

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

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

        System.out.println(Address);

获取互联网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


0

首先,检查清单文件以获取权限:

<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() 方法。


0
你的Android程序清单中是否具有WiFi设置的权限?至少需要ACCESS_WIFI_STATE[1]。如果这不足够,可能还需要ACCESS_NETWORK_STATE[2]。我没有在你的代码中发现任何问题,所以我的建议是尝试调整清单文件。
我作为来源的第一个链接中,在被接受的答案中也包括了INTERNET权限,这样你的程序就可以联系某个地方以请求连接和IP地址。如果前两个权限不起作用,那么接下来就是尝试申请这个权限。 你问到了官方或可信来源的问题,这些都来自可信的来源。在Stackoverflow上,每一条信息都至少得到了一次投票,如果某件事情说明这些东西至少对某些人有用。 我的来源:
[1] 如何从代码中获取设备的IP地址?

[2] Android WifiManager getConnectionInfo需要CHANGE_WIFI_STATE权限吗?


-1
请使用这段代码。
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直连IP地址。 - user1850484

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接