Android: как узнать, что IP-адрес является IP-адресом Wi-Fi?

Я хочу знать, является ли IP-адрес устройства Android IP-адресом данных или IP-адресом Wi-Fi.


1) Устройство сначала подключено к 3G, теперь устройству будет назначен сетевой IP.
2) Позже устройство подключилось к WIFI, теперь устройству будет назначен IP-адрес WIFI.
3) Любой Android API, который сообщит нам, что IP-адрес является IP-адресом Wi-Fi или IP-адресом сети ??

Используется ниже в 2.3.5, и все было хорошо, но в 4.0.3 ICS имеет некоторые проблемы.

   /**
 * Is the IP Address a a Wifi Ip Address.
 * @param ipAddr
 * @return boolean
 */
public boolean isWifiIp(byte[] ipAddr){
    try{
        WifiManager mgr = (WifiManager)mCxt.getSystemService(Context.WIFI_SERVICE);
        int wifiIP = mgr.getConnectionInfo().getIpAddress();
        int reverseWifiIP = Integer.reverseBytes(wifiIP);  
        int byteArrayToInt = byteArrayToInt(ipAddr,0);

        if(byteArrayToInt == wifiIP || byteArrayToInt == reverseWifiIP)
            return true;
    }catch (Exception e) {
        Logger.d(TAG, e);
    }
    return false;
}


/**
 * Convert IP Address in bytes to int value.
 * @param arr
 * @param offset
 * @return int
 */
public static final int byteArrayToInt(byte[] arr, int offset) {
    if (arr == null || arr.length - offset < 4)
        return -1;

    int r0 = (arr[offset] & 0xFF) << 24;
    int r1 = (arr[offset + 1] & 0xFF) << 16;
    int r2 = (arr[offset + 2] & 0xFF) << 8;
    int r3 = arr[offset + 3] & 0xFF;
    return r0 + r1 + r2 + r3;
}

/**
 *  Fetches the IP Address of the Client. There is Delay of 2 Seconds for the API to return.
 */
public String getClientIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if(isWifiIp(inetAddress.getAddress())){
                    Logger.d(TAG, "-------- Local IP Address; Not Valid: "+inetAddress.getHostAddress());
                    continue;
                }
                if (!inetAddress.isLoopbackAddress()) {
                    String ipAddress = Formatter.formatIpAddress(inetAddress.hashCode());
                    Logger.d(TAG, "-------- Some Valid IPv4 is ---"+ipAddress);
                    return ipAddress;
                }
            }
        }
    } catch (SocketException ex) {
        Logger.e(TAG, ex.toString());
    }
    return null;
}

Пожалуйста, помогите


4) Когда я выключаю сеть мобильной передачи данных и включен Wi-Fi, я все равно получаю некоторый действительный IPv4-адрес, которого нет в 2.3.5 и ниже.

Спасибо


person NitZRobotKoder    schedule 21.05.2012    source источник
comment
Вопрос неверен на многих уровнях ...   -  person Dogcat    schedule 14.09.2016
comment
Что не так, уточни и исправь ..   -  person NitZRobotKoder    schedule 14.09.2016


Ответы (3)


Вы не можете определить тип подключения на основе IP-адреса, потому что ваша мобильная сеть и домашняя сеть Wi-Fi могут назначать частный IP-адрес.

Что вам нужно сделать, это сначала определить, есть ли у вас мобильная сеть или Wi-Fi, а затем на основе этой информации получить IP-адрес этого подключения.

person waqaslam    schedule 21.05.2012
comment
Чтобы дополнить этот ответ, взгляните на этот вопрос об определении типа сетевого подключения на Android: stackoverflow.com/questions/2802472/ - person Guido; 21.05.2012
comment
Вы читали ссылку, предложенную Гвидо Гарсиа? у него есть хорошие инструкции по обнаружению нескольких разных типов сетей - person waqaslam; 21.05.2012

Попробуйте этот код

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.widget.Toast;

import com.blundell.tut.R;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        checkAvailableConnection();
    }

    void checkAvailableConnection() {
        ConnectivityManager connMgr = (ConnectivityManager) this
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        final android.net.NetworkInfo mobile = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if (wifi.isAvailable()) {

            WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
            WifiInfo myWifiInfo = myWifiManager.getConnectionInfo();
            int ipAddress = myWifiInfo.getIpAddress();
            System.out.println("WiFi address is "
                    + android.text.format.Formatter.formatIpAddress(ipAddress));

        } else if (mobile.isAvailable()) {

            GetLocalIpAddress();
            Toast.makeText(this, "3G Available", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "No Network Available", Toast.LENGTH_LONG)
                    .show();
        }
    }

    private String GetLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
            return "ERROR Obtaining IP";
        }
        return "No IP Available";
    }
}
person Aerrow    schedule 21.05.2012

Нашел трюк ... http://developer.android.com/reference/java/net/NetworkInterface.html#getName()

getName for WiFi будет начинаться с wlan..с использованием этого подтвержденного IP-адреса WiFi.

person NitZRobotKoder    schedule 11.04.2014