39 votes

Obtenir par programme les détails de la passerelle et du masque de sous-réseau

Comment puis-je obtenir les détails de la passerelle et du masque de sous-réseau dans Android ?

80voto

AndroidKid Points 3330

J'ai trouvé une classe appelée DhcpInfo au sein de la android.net l'emballage. Il possède des variables publiques qui stockent les valeurs des paramètres actuels du réseau. Mais le problème est qu'elles renvoient la valeur sous forme d'entier converti à partir d'un binaire décalé de 8 bits.

Exemple d'image décrivant le scénario :

enter image description here

****Voici un exemple de code:**

**fichier Java : ****

package com.schogini.dhcp;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
import android.net.*;
import android.net.wifi.WifiManager;

public class dhcpInfo extends Activity {
    public String   s_dns1 ;
    public String   s_dns2;     
    public String   s_gateway;  
    public String   s_ipAddress;    
    public String   s_leaseDuration;    
    public String   s_netmask;  
    public String   s_serverAddress;
    TextView info;
    DhcpInfo d;
    WifiManager wifii;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        wifii= (WifiManager) getSystemService(Context.WIFI_SERVICE);
        d=wifii.getDhcpInfo();

        s_dns1="DNS 1: "+String.valueOf(d.dns1);
        s_dns2="DNS 2: "+String.valueOf(d.dns2);    
        s_gateway="Default Gateway: "+String.valueOf(d.gateway);    
        s_ipAddress="IP Address: "+String.valueOf(d.ipAddress); 
        s_leaseDuration="Lease Time: "+String.valueOf(d.leaseDuration);     
        s_netmask="Subnet Mask: "+String.valueOf(d.netmask);    
        s_serverAddress="Server IP: "+String.valueOf(d.serverAddress);

        //dispaly them
        info= (TextView) findViewById(R.id.infolbl);
        info.setText("Network Info\n"+s_dns1+"\n"+s_dns2+"\n"+s_gateway+"\n"+s_ipAddress+"\n"+s_leaseDuration+"\n"+s_netmask+"\n"+s_serverAddress);
    }
}

xml Codage :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.schogini.dhcp"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".dhcpInfo"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
</manifest>

J'ai essayé de convertir la valeur entière en son équivalent, mais je n'y suis pas parvenu. Si vous le faites, vous pouvez renvoyer un message Au revoir

MISE A JOUR : J'ai réussi à convertir l'IP en format v4 à partir de la forme entière. Conversion au format IPv4 :

public String intToIp(int i) {

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

IMAGE Courtesy : http://www.bennadel.com/blog/1830-Converting-IP-Addresses-To-And-From-Integer-Values-With-ColdFusion.htm

14voto

rtc11 Points 191

Formatter.formatIpAddress(int) est obsolète, et nous ne voulons pas utiliser des méthodes obsolètes, n'est-ce pas ?

La version d'AndroidKid est en quelque sorte inversée, mais ceci devrait la corriger :

public String intToIp(int addr) {
    return  ((addr & 0xFF) + "." + 
            ((addr >>>= 8) & 0xFF) + "." + 
            ((addr >>>= 8) & 0xFF) + "." + 
            ((addr >>>= 8) & 0xFF));
}

Source : http://www.devdaily.com/java/jwarehouse/Android/core/java/Android/net/DhcpInfo.java.shtml

5voto

Goldeneye Points 69

Pour formater l'ip, essayez d'utiliser :

import android.text.format.Formatter;

public String FormatIP(int IpAddress)
{
    return Formatter.formatIpAddress(IpAddress);
}

4voto

M1n1_Z Points 24

C'est un vieux fil, mais j'ai trouvé la fonction officielle utilisée par l'API Android (package android.net.NetworkUtils ):

/**
 * Convert a IPv4 address from an integer to an InetAddress.
 * @param hostAddress an int corresponding to the IPv4 address in network byte order
 */
public static InetAddress intToInetAddress(int hostAddress) {
    byte[] addressBytes = { (byte)(0xff & hostAddress),
                            (byte)(0xff & (hostAddress >> 8)),
                            (byte)(0xff & (hostAddress >> 16)),
                            (byte)(0xff & (hostAddress >> 24)) };

    try {
       return InetAddress.getByAddress(addressBytes);
    } catch (UnknownHostException e) {
       throw new AssertionError();
    }
}

Et une fois que vous avez InetAddress vous pouvez obtenir la chaîne formatée de cette façon :

intToInetAddress(d.gateway).getHostAddress()

3voto

Balflear Points 59

Utilisation Formatter.formatIpAddress(mask); Le masque est votre int.

String maskk = Formatter.formatIpAddress(mask);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X