获取我的设备的WiFi直接IP地址

时间:2013-11-28 10:36:39

标签: java android ip wifi-direct

我正在尝试获取设备的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并且没有其他方法也可以工作..帮助!!

7 个答案:

答案 0 :(得分:11)

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

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

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

通话Context.getSystemService(Context.WIFI_P2P_SERVICE)将为您提供WiFiP2P管。

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

答案 1 :(得分:4)

将对等方的本地IP地址(以192.168.x.x开头)发送给组所有者。在这次“握手”之后,这并不需要时间,这一切都很好。没有找到任何其他方式来获取对等方的IP地址,GroupListener / PeerListener / ...提供的唯一信息是mac地址。

答案 2 :(得分: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; }
         */
    }

答案 3 :(得分:0)

您是否拥有附加到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?

答案 4 :(得分:0)

如果您尝试获取连接到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

答案 5 :(得分: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()方法。

答案 6 :(得分:-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" />