web-dev-qa-db-fra.com

Connectivité Ethernet via programmation (Android) (appareil enraciné)

J'ai un petit problème concernant Ethernet

Mes trois questions sont:

  1. Peut-on activer/désactiver Ethernet par programme?

  2. Pouvons-nous activer/désactiver par programmation Ethernet?

  3. Pouvons-nous connecter par programmation Ethernet?

Les questions ci-dessus sont faites avec la Wifi. Comme  

  1. Nous pouvons par programme activer/désactiver Wifi.

  2. Nous pouvons activer/désactiver par programmation Wifi par programmation.

  3. Nous pouvons par programme Connecter Wifi en utilisant WifiManager.

Est-ce qu'Android fournit une EthernetManager comme WifiManager pour gérer Ethernet?

Ou, si cela ne semble pas réalisable, alors mon exigence initiale est:

La première chose que je vais effacer est "DEVICE IS ROOTED".

Puis-je manipuler les paramètres (par défaut)? Par exemple, je ne veux aucune autre option dans le Settings.apk que WIFI et Ethernet. Il devrait afficher uniquement Wifi et Ethernet. C'est tout. Puis-je désactiver toutes les options des paramètres ou puis-je supprimer toutes les autres options des paramètres? 

18
Manohar Perepa

La solution que je vais présenter ici est un hack utilisant la réflexion et ne fonctionne que sur un système Android enraciné.

Votre appareil peut avoir le populaire paquet Android.net.ethernet. Dans une activité, essayez

Object emInstance = getSystemService("ethernet");

Il retourne une instance valide de EthernetManager ou null. Null signifie que vous n'avez pas de chance.

Une exigence supplémentaire peut dépendre de votre appareil: Ethernet et Wifi peuvent uniquement fonctionner exclusivement. Vous devrez peut-être désactiver le Wi-Fi pour activer Ethernet et inversement.

Pour activer Ethernet par réflexion, utilisez votre instance de EthernetManager . La méthode que vous souhaitez appeler est setEthEnabled (boolean enabled).

    Class<?> emClass = null;
    try {
        emClass = Class.forName("Android.net.ethernet.EthernetManager");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Object emInstance = getSystemService("ethernet");

    Method methodSetEthEnabled = null;
    try {
        methodSetEthEnabled = emClass.getMethod("setEthEnabled", Boolean.TYPE);
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    methodSetEthEnabled.setAccessible(true);
    try {
        // new Boolean(true) to enable, new Boolean(false) to disable
        methodSetEthEnabled.invoke(emInstance, new Boolean(false));
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Votre manifeste d'application a besoin de ces autorisations

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />

L'autorisation WRITE_SECURE_SETTINGS ne peut être acquise que par les applications système. L'application n'a pas besoin d'être signée par une clé système. Il peut s'agir de n'importe quel signe valide (comme la fonction standard d'exportation Android App). Utilisez busybox pour remonter la partition système pour un accès en écriture et déplacez votre apk dans le dossier/system/app. Redémarrez l'appareil et cela devrait fonctionner.

Peut-on connecter par programme Ethernet?

Il n'y a pas de point d'accès pour vous connecter comme avec le Wifi. Vous le configurez pour DHCP ou vous fournissez des valeurs statiques. Cela peut bien entendu également être effectué via réflexion . Vous aurez besoin de la classe EthernetDevInfo pour cela.

L'implémentation réelle de EthernetManager et EthernetDevInfo peut légèrement différer entre les versions et les périphériques Android car elle n'a pas (encore) à se conformer à une API publique et peut même être une version personnalisée. vous pouvez utiliser un Introspector ou réflexion en général.

11
Robin Gawenda

Ok voici quelques méthodes que j’ai faites pour manipuler avec l’ETHERNET INTERFACE (eth0).

1) Une méthode pour vérifier si une interface ethernet existe

public static boolean doesEthExist() {
        List<String> list = getListOfNetworkInterfaces();

        return list.contains("eth0");
    }

public static List<String> getListOfNetworkInterfaces() {

        List<String> list = new ArrayList<String>();

        Enumeration<NetworkInterface> nets;

        try {
            nets = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {

            e.printStackTrace();
            return null;
        }

        for (NetworkInterface netint : Collections.list(nets)) {

            list.add(netint.getName());
        }

        return list;

    }

2) Une méthode pour vérifier si ETHERNET est activé ou activé

public static boolean isEthOn() {

        try {

            String line;
            boolean r = false;

            Process p = Runtime.getRuntime().exec("netcfg");

            BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));   
            while ((line = input.readLine()) != null) {   

                if(line.contains("eth0")){
                    if(line.contains("UP")){
                        r=true;
                    }
                    else{
                        r=false;
                    }
                }
            }   
            input.close();

            Log.e("OLE","isEthOn: "+r);
            return r; 

        } catch (IOException e) {
            Log.e("OLE","Runtime Error: "+e.getMessage());
            e.printStackTrace();
            return false;
        }

    }

3) Une méthode pour activer ou désactiver Ethernet en fonction de l'état dans lequel il se trouve 

public static void turnEthOnOrOff() {

        try {

            if(isEthOn()){
                Runtime.getRuntime().exec("ifconfig eth0 down");

            }
            else{
                Runtime.getRuntime().exec("ifconfig eth0 up");
            }

        } catch (IOException e) {
            Log.e("OLE","Runtime Error: "+e.getMessage());
            e.printStackTrace();
        }
    }

4) Une méthode de connexion via ethernet en fonction du type choisi (dhcp/statique)

private boolean connectToStaticSettingsViaIfconfig(StaticConnectionSettings scs) {


        try {

            if(typeChosen.equalsIgnoreCase("dhcp")){

                Runtime.getRuntime().exec("ifconfig eth0 dhcp start");
            }
            else{

                Runtime.getRuntime().exec("ifconfig eth0 "+scs.getIp()+" netmask "+scs.getNetmask()+" gw "+scs.getGateway());
            }

        } catch (IOException e) {
            Log.e("OLE","Runtime Error: "+e.getMessage());
            e.printStackTrace();
            return false;
        }

        return true;
    }

Il existe une classe supplémentaire que j’ai créée pour stocker toutes les valeurs eth nécessaires. Cette classe est ensuite initialisée avec les valeurs que l'utilisateur insère.

public class StaticConnectionSettings {

    private String ip, netmask, dns, mac, gateway, type;

//Getters and Setters
}

C'est ça ... Je vais le tester sous peu ... Ce code manque d'une phase de test (ping). Et peut-être faut-il configurer le DNS. Mais cela peut être fait facilement. Je ne l'ai pas inclus car je pense que sur notre appareil, il fonctionnera également sans le réglage DNS.

11
MTurPash

Trois réponses aux questions ci-dessus:

  1. Oui. Vous pouvez essayer d'utiliser ifconfig eth0 down ; ifconfig eth0 up. Mais je ne l'ai pas encore testé par moi-même.
  2. Oui, mais vous n'êtes pas obligé. Android fait la commutation pour vous. Si vous vous connectez au WiFi, Ethernet est désactivé. Si vous êtes déjà connecté au WiFi et que vous branchez votre câble Ethernet dans l'appareil. il vous suffit de désactiver le WiFi (ce que vous savez comment faire) et Android bascule automatiquement vers Ethernet. 
  3. Pas si facile qu'on pourrait le penser. J'ai le même problème et jusqu'à présent, je n'ai trouvé qu'une solution que je n'ai pas encore testée. Étant donné qu'Android fonctionne sur le noyau Linux, nous pouvons utiliser ifconfig afin de manipuler la connexion Ethernet.

Une explication est cachée ici: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

Et la vidéo youtube de cette conférence

http://www.youtube.com/watch?v=LwI2NBq7BWM

Et une référence sur la façon d'utiliser ifconfig pour Android 

Android ethernet configurer IP en utilisant dhcp

Donc si vous parvenez à une solution possible, merci de la partager !! Si je vais le faire avant vous je certenly. 

0
MTurPash

Cela fonctionne pour Android 6.0.1

Class<?> ethernetManagerClass = Class.forName("Android.net.ethernet.EthernetManager");

Method methodGetInstance = ethernetManagerClass.getMethod("getInstance");
Object ethernetManagerObject = methodGetInstance.invoke(ethernetManagerClass);

Method methodSetEthEnabled = ethernetManagerClass.getMethod("setEthernetEnabled", Boolean.TYPE);
methodSetEthEnabled.invoke(ethernetManagerObject, isEnabled);
0
klnvch