2014-02-13 13 views
15

Ich habe ein kleines Problem in Bezug auf Ethernet.Ethernet-Verbindung programmgesteuert (Android) (Root-Gerät)

Meine drei Fragen sind:

  1. Können wir Turn-On/Off Ethernet programmatisch?

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

  3. Können wir programmgesteuert Ethernet verbinden?

Die oben genannten Fragen werden mit dem Wifi getan. Wie

  1. können wir programmatisch Turn-On/Off Wifi.

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

  3. Wir können Wifi über WifiManager programmgesteuert verbinden.

Does android jede EthernetManager wie als WifiManager bietet Ethernet zu behandeln?

Oder, wenn dies nicht möglich scheint, dann meine ursprüngliche Anforderung ist:

Das erste, was ich klar werde, ist „DEVICE wurzelt“.

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

Antwort

0

Drei answeres auf Ihre oben genannten 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 Sie müssen nicht. Android macht das Schalten für Sie. Wenn Sie eine Verbindung zu WiFi herstellen, wird Ethernet deaktiviert. Wenn Sie bereits mit WiFi verbunden sind und Ihr Ethernet-Kabel in das Gerät einstecken; Sie müssen nur WiFi deaktivieren (was Sie wissen) und Android schaltet automatisch auf Ethernet.
  3. Nicht so einfach wie Sie vielleicht denken. Ich habe das gleiche Problem und bis jetzt habe ich nur eine Lösung gefunden, die ich noch nicht getestet habe. Da Android auf dem Linux-Kernel läuft, können wir ifconfig verwenden, um die Ethernet-Verbindung zu manipulieren. http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

    und das YouTube-Video von diesem Vortrag

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

    Und einen Verweis auf wie ifconfig für android

    Android ethernet configure IP using dhcp

    zu verwenden:

ist eine Erklärung hier versteckt

Also, wenn Sie zu einer möglichen Lösung kommen, teilen Sie es bitte !! Wenn ich es vor dir tue, werde ich centrenly.

+0

Haben Sie es geschafft? Ich bin vor es auch – Manmohan

+0

Nein, leider nicht :(... sorry – MTurPash

+0

Pech von mir .. gleiche wie du .. wird hier aktualisiert, wenn etwas Nützliches – Manmohan

9

Ok, hier sind einige Methoden, die ich für die Manipulation mit der ETHERNET INTERFACE (eth0) gemacht habe.

1) Ein Verfahren zum Prüfen, ob eine Ethernet-Schnittstelle vorhanden

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) ein Verfahren zur Überprüfung, ob die Ethernet-fähig ist, oder auf

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) Ein Verfahren zum Aktivieren oder Deaktivieren das Ethernet in Abhängigkeit von dem Zustand, 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 für connec ting über Ethernet auf dem gewählten Typ abhängig (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 i benötigt zum Speichern aller eth Werte erstellt. Diese Klasse wird dann mit den Werten initialisiert, die der Benutzer einfügt.

Das ist es ... Ich werde es in Kürze testen ... Dieser Code fehlt eine Testphase (Ping). Und vielleicht braucht es Einstellung von DNS. Aber das kann leicht gemacht werden. Ich habe es nicht aufgenommen, weil ich denke, auf unserem Gerät wird es auch ohne die DNS-Einstellung funktionieren.

+0

In meiner Erfahrung gefunden: 1) 'ifconfig eth0 down' nicht funktioniert , Android stellt die Schnittstelle automatisch wieder her und 2) 'ifconfig eth0 dhcp start' funktioniert auch nicht. – m0skit0

+0

Nr. 'Ifconfig' funktioniert nicht in meinem Fall. Es funktioniert nur mit 'busybox ifconfig'. Offensichtlich benötigt es Root-Rechte, aber ich kann nicht davon ausgehen, dass das Produktionsgerät verwurzelt ist. – Yeung

+0

Wie können wir Daten an das Ethernet senden, wenn Sie feststellen, dass Sie mit dem Ethernet verbunden sind? . – Arlyn

10

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

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

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

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

Um Ethernet über Reflektion zu aktivieren, verwenden Sie Ihre Instanz des EthernetManagers. Die Methode, die Sie aufrufen möchten 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(); 
    } 

Ihre Anwendung manifestieren muss diese Berechtigungen

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

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

Können wir programmatisch Ethernet verbinden?

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

Die tatsächliche Implementierung von EthernetManager und EthernetDevInfo kann zwischen Android-Versionen und -Geräten leicht abweichen, da sie (noch) keiner öffentlichen API entsprechen muss und möglicherweise sogar eine benutzerdefinierte Version ist. Um eine Liste der Getter und Setter zu erhalten, können Sie eine Introspector oder Reflexion im Allgemeinen verwenden.

+0

in meinem Fall (Android 2.3) war es android.net.EthernetManager und setEthernetEnabled Methode. Aber dann bekomme ich Fehler java.lang.reflect.InvocationTargetException – djdance

+0

nicht funktioniert, habe ich 'NoSuchMethodException' Fehler – MBH

+0

@Robin Sie alles falsch machen. Sie müssen 'getSystemService (" ethernet ")' in 'EthernetManager' umwandeln. Besser noch, benutz 'getSystemService (Context.ETHERNET_SERVICE) 'und wirf das. Dann können Sie die richtigen Schnittstellen für diesen Manager/Service verwenden. –

Verwandte Themen