wake-up-neo.com

Ethernet-Konnektivität durch programmgesteuert (Android) (gerootetes Gerät)

Ich habe ein kleines Problem bezüglich Ethernet

Meine drei Fragen sind:

  1. Können wir Ethernet programmgesteuert ein- und ausschalten?

  2. Können wir Ethernet programmgesteuert aktivieren/deaktivieren?

  3. Können wir Ethernet programmgesteuert verbinden?

Die obigen Fragen werden mit der Wifi erledigt. Mögen  

  1. Wir können Wifi programmgesteuert ein- und ausschalten.

  2. Wir können Wifi programmgesteuert aktivieren/deaktivieren.

  3. Wir können Wifi mit WifiManager programmgesteuert verbinden.

Bietet Android eine EthernetManager wie WifiManager, um mit Ethernet umzugehen?

Wenn dies nicht machbar erscheint, lautet meine ursprüngliche Anforderung:

Das erste, was ich klarstellen werde, ist "GERÄT IS ROOTED"].

Kann ich die Einstellungen bearbeiten (Standard)? Ich möchte keine andere Option im Settings.apk als WIFI und Ethernet. Es sollte nur Wifi und Ethernet anzeigen. Das ist es. Kann ich alle Optionen in den Einstellungen deaktivieren oder kann ich alle anderen Optionen aus den Einstellungen entfernen? 

18
Manohar Perepa

Die Lösung, die ich hier vorstellen werde, ist ein Hack mit Reflektion und funktioniert nur auf einem verwurzelten Android-System.

Ihr Gerät verfügt möglicherweise über das beliebte Android.net.ethernet-Paket. Versuchen Sie es in einer Aktivität

Object emInstance = getSystemService("ethernet");

Es gibt eine gültige Instanz des EthernetManagers oder null zurück. Null bedeutet, dass Sie kein Glück haben.

Eine zusätzliche Anforderung hängt von Ihrem Gerät ab: Ethernet und Wifi funktionieren möglicherweise nur exklusiv. Möglicherweise müssen Sie Wifi deaktivieren, um Ethernet zu aktivieren und umgekehrt.

Um Ethernet per Reflection zu aktivieren, verwenden Sie Ihre Instanz des EthernetManagers . Die aufzurufende Methode ist setEthEnabled (Boolean aktiviert).

    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();
    }

Ihr Anwendungsmanifest benötigt diese Berechtigungen

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

Die Berechtigung WRITE_SECURE_SETTINGS kann nur von System-Apps erworben werden. Die App muss nicht mit einem Systemschlüssel signiert sein. Es kann ein beliebiges gültiges Zeichen sein (wie die normale Android-App-Exportfunktion). Verwenden Sie busybox, um die Systempartition für den Schreibzugriff erneut bereitzustellen, und verschieben Sie Ihre apk in den Ordner/system/app. Starten Sie das Gerät neu und es sollte funktionieren.

Können wir programmgesteuert Ethernet anschließen?

Es gibt keinen Zugangspunkt, um Sie mit Wifi zu verbinden. Sie konfigurieren es entweder für DHCP oder geben statische Werte an. Dies kann natürlich auch über die Reflektion erfolgen . Dazu benötigen Sie die Klasse EthernetDevInfo.

Die tatsächliche Implementierung von EthernetManager und EthernetDevInfo kann sich zwischen Android-Versionen und Geräten leicht unterscheiden, da sie (noch) nicht mit einer öffentlichen API übereinstimmen muss und möglicherweise sogar eine benutzerdefinierte Version ist Sie können eine Introspector oder Reflexion im Allgemeinen verwenden.

11
Robin Gawenda

Ok, hier sind einige Methoden, die ich mit der ETHERNET-Schnittstelle (eth0) manipuliert habe.

1) Eine Methode zur Überprüfung, ob eine Ethernet-Schnittstelle vorhanden ist

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) Eine Methode zur Überprüfung, ob das ETHERNET aktiviert oder eingeschaltet ist

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) Eine Methode zum Aktivieren oder Deaktivieren des Ethernet abhängig vom Status, in dem es sich befindet 

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) Eine Methode zur Verbindung über Ethernet, abhängig vom gewählten Typ (dhcp/static)

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;
    }

Es gibt eine weitere Klasse, die ich erstellt habe, um alle erforderlichen eth-Werte zu speichern. Diese Klasse wird dann mit den Werten initialisiert, die der Benutzer einfügt.

public class StaticConnectionSettings {

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

//Getters and Setters
}

Das ist es ... Ich werde es in Kürze testen ... Dieser Code enthält keine Testphase (Ping). Und vielleicht muss DNS eingestellt werden. Dies ist jedoch problemlos möglich. Ich habe es nicht aufgenommen, weil ich denke, dass es auf unserem Gerät auch ohne die DNS-Einstellung funktionieren wird.

11
MTurPash

Drei Antworten auf Ihre obigen Fragen:

  1. Ja. Sie könnten versuchen, ifconfig eth0 down ; ifconfig eth0 up zu verwenden. Aber ich habe es noch nicht selbst getestet.
  2. Ja, aber das muss nicht sein. Android übernimmt den Wechsel für Sie. Wenn Sie eine WLAN-Verbindung herstellen, wird das Ethernet deaktiviert. Wenn Sie bereits mit WLAN verbunden sind und Ihr Ethernet-Kabel an das Gerät anschließen; Sie müssen nur WiFi deaktivieren (was Sie wissen) und Android schaltet automatisch auf Ethernet um. 
  3. Nicht so einfach wie du vielleicht denkst. Ich habe das gleiche Problem und bisher habe ich nur eine Lösung gefunden, die ich noch nicht getestet habe. Da Android auf dem Linux-Kernel läuft, können Sie ifconfig verwenden, um die Ethernet-Verbindung zu manipulieren.

Eine Erklärung ist hier verborgen: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

Und das Youtube-Video dieser Vorlesung

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

Und eine Referenz zur Verwendung von ifconfig für Android 

Android-Ethernet-IP mit DHCP konfigurieren

Wenn Sie also zu einer möglichen Lösung kommen, teilen Sie diese bitte! Wenn ich es vor dir machen werde, werde ich es tun. 

0
MTurPash

Es funktioniert für 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