Android获取IP地址


一、通过WIFI管理服务来获取IP地址

private void getWifiIP() {

    //获取WIFI管理服务
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    //判断WIFI是否开启,如果没有开启就自动开启
    if (!wifiManager.isWifiEnabled()) {
        // 开启WIFI,需要设置用户权限:android.permission.CHANGE_WIFI_STATE
        wifiManager.setWifiEnabled(true);
        Toast.makeText(MainActivity.this, "正在开启WIFI,请稍后重新获取IP地址。", Toast.LENGTH_SHORT).show();
    }

    //获取WIFI信息,需要设置用户权限:android.permission.ACCESS_WIFI_STATE
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();

    //获得整型的IP地址
    int iIP = wifiInfo.getIpAddress();

    //将整型的IP地址转换为字符串类型的IP地址
    String sIP = intToIP(iIP);

    //显示IP地址
    m_tvIP.setText(sIP);
}


//将得到的int类型的IP转换为String类型
private String intToIP(int i) {

    return ( (i >> 0)  & 0xFF ) + "." +
           ( (i >> 8)  & 0xFF ) + "." +
           ( (i >> 16) & 0xFF ) + "." +
           ( (i >> 24) & 0xFF ) ;
}



二、通过系统连接服务来获取IP地址

private void getIP() {
    //获取系统的连接服务
    ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    //获取网络连接信息,需要设置用户权限:android.permission.ACCESS_NETWORK_STATE
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    //判断网络是否连接,如果没有连接就跳到设置页面进行网络设置
    if (networkInfo != null && networkInfo.isConnected()) {
        if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { //mobile网络连接模式,即GPRS网络
            try {
                //获取网络接口信息,需要设置用户权限:android.permission.INTERNET
                //枚举网络接口信息,即网卡信息连接信息
                for (Enumeration<NetworkInterface>en=NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                    NetworkInterface networkInterface = en.nextElement();

                    //枚举IP地址,如IPv4、IPv6的IP地址
                    for (Enumeration<InetAddress>enAddr=networkInterface.getInetAddresses(); enAddr.hasMoreElements();) {
                        InetAddress inetAddress = enAddr.nextElement();

                        //判断地址类型:不是本地回环地址127.0.0.1,是IPv4的地址类型
                        if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                            //显示IP地址
                            m_tvIP.setText(inetAddress.getHostAddress());
                        }
                    }
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }
        } else if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { //wifi网络连接模式
            //获取WIFI管理服务
            WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

            //获取WIFI信息,需要设置用户权限:android.permission.ACCESS_WIFI_STATE
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();

            //获取WIFI模式下的IP地址并显示
            int iIP = wifiInfo.getIpAddress();
            String sIP = intToIP(iIP);
            m_tvIP.setText(sIP);
        } else {
            m_tvIP.setText("网络类型:" + networkInfo.getTypeName());
        }
    } else {
        Toast.makeText(MainActivity.this, "当前无网络连接,请在设置中打开网络。", Toast.LENGTH_SHORT).show();
        setNetwork(MainActivity.this); //弹出对话框提示是否进行网络设置
    }
}



//弹出对话框,是否打开设置界面进行网络设置
private void setNetwork(final Context context){
    //提示对话框
    AlertDialog.Builder builder=new AlertDialog.Builder(context);
    builder.setTitle("网络设置提示").setMessage("网络连接不可用,是否进行设置?")
            .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
                    context.startActivity(intent);//跳转到设置页面
                }
            })
            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            })
            .show();
}


以上操作需要在AndroidMainfest.xml文件中添加以下用户权限:

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


你可能感兴趣的:(Android)