2014-02-13 65 views
15

我有一個關於以太網一個小問題。以太網連接通過編程方式(安卓)(root權限的設備)

我的三個問題是:

  1. 我們能夠以編程方式開啓/關閉Ethernet

  2. 我們能否通過編程啓用/禁用Ethernet

  3. 我們能編程連接Ethernet

上述問題與Wifi完成。像

  1. 我們可以通過編程的開/關Wifi

  2. 我們可以通過編程方式啓用/禁用Wifi

  3. 我們可以通過編程WifiManager連接Wifi

請問Android提供任何EthernetManager等爲WifiManager處理Ethernet

或者,如果這似乎並不可行,那麼我原來的要求是:

我要清除的第一件事是「設備植根」。

我可以操控設置(默認)?像Settings.apkWIFIEthernet之外,我不想要任何其他選項。它應該只顯示WifiEthernet。而已。我可以禁用「設置」中的所有選項,還是可以從「設置」中刪除所有其他選項?

回答

0

三Answeres到你上面的問題:

  1. 是。你可以嘗試使用ifconfig eth0 down ; ifconfig eth0 up。但我還沒有自己測試過它。
  2. 是的,但你不必。 Android爲您做了切換。如果連接到WiFi,以太網將禁用。如果您已連接到WiFi,並將以太網電纜插入設備;你只需要禁用WiFi(你知道如何)和android自動切換到以太網。
  3. 沒有你想象的那麼容易。我有同樣的問題,直到現在我發現只有一個解決方案,我還沒有測試過。由於android在linux內核上運行,我們可以使用ifconfig來操作以太網連接。

的解釋是隱藏在這裏: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

而且這個講座

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

的YouTube視頻,並就如何使用ifconfig命令的Android

Android ethernet configure IP using dhcp

參考

所以,如果你來一個可能的解決方案,請分享它!如果我會在你之前這樣做,我會認證的。

+0

你成功了嗎?我也面臨它 – Manmohan

+0

不,很抱歉沒有:(......對不起 – MTurPash

+0

困難的我..與你一樣..會在這裏更新時發現有用的東西 – Manmohan

9

好的,這裏有一些方法我用ETHERNET INTERFACE(eth0)進行操作。

1)。一種用於如果一個以太網接口存在檢查方法

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)一種用於如果以太網是啓用還是ON檢查方法

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)一種用於啓用或禁用方法取決於其狀態的以太網

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)一種用於連接廷通過以太網取決於所選擇的類型(DHCP /靜態)

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

有我用於存儲所有需要的ETH值創建一個多個類。這個類是用用戶插入的值初始化的。

public class StaticConnectionSettings { 

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

//Getters and Setters 
} 

這就是它......我將很快測試它...此代碼缺少測試階段(ping)。也許它需要設置DNS。但這可以輕鬆完成。我沒有收錄它,因爲我認爲在我們的設備上它也可以在沒有DNS設置的情況下工作。

+0

根據我的經驗:1)'ifconfig eth0 down'不起作用,Android會自動重新啓動接口,並且2)'ifconfig eth0 dhcp start'也不起作用。 – m0skit0

+0

編號'ifconfig'在我的情況下不起作用。它只適用於'busybox ifconfig'。顯然,它需要root權限,但我不能認爲生產設備是根植的。 – Yeung

+0

一旦你發現你連接到以太網,我們怎麼能發送數據到以太網? – Arlyn

10

我將在這裏介紹的解決方案是使用反射的黑客攻擊,並且只能在根系Android系統上工作。

您的設備可能具有流行的android.net.ethernet軟件包。在活動中,嘗試使用

Object emInstance = getSystemService("ethernet"); 

它返回EthernetManager的有效實例或null。空意味着你運氣不好。

一個額外的要求可能取決於您的設備:以太網和Wifi可能只能獨家使用。您可能需要禁用Wifi才能啓用以太網,反之亦然。

要通過反射啓用以太網,請使用您的EthernetManager實例。 要調用的setEthEnabled的方法(布爾啓用)

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

你的應用程序清單需要這些權限

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

WRITE_SECURE_SETTINGS只能通過系統的應用程序來獲得的權限。該應用程序不需要由系統密鑰簽名。它可以是任何有效的符號(如常規Android App導出函數)。使用busybox重新掛載系統分區以進行寫入訪問,並將apk移至/ system/app文件夾。重新啓動設備,它應該工作。

我們可以通過編程方式連接以太網嗎?

有沒有接入點連接你喜歡Wifi。您可以將其配置爲DHCP或提供靜態值。這當然也可以通過反思來完成。 您需要使用EthernetDevInfo類。

EthernetManager和EthernetDevInfo的實際實現可能在Android版本和設備之間略有不同,因爲它不必符合公共API(還),甚至可能是自定義版本。 要獲取吸氣劑和吸附劑的列表,您可以使用Introspector或反射。

+0

在我的情況下(android 2.3)它是android.net.EthernetManager和setEthernetEnabled方法。但後來我得到錯誤java.lang.reflect.InvocationTargetException – djdance

+0

不工作,我得到了'NoSuchMethodException'錯誤 – MBH

+0

@Robin你這樣做是錯的。您需要將'getSystemService(「ethernet」)''轉換爲'EthernetManager'。更好的是,使用'getSystemService(Context.ETHERNET_SERVICE)'並進行強制轉換。然後,您可以爲該管理器/服務使用適當的界面。 –

相關問題