通过编程方式实现以太网连接(Android)(Root设备)

我有一个关于以太网的小问题。

我的三个问题是:

  1. 我们可以通过编程方式打开/关闭Ethernet吗?

  2. 我们可以编程启用/禁用Ethernet吗?

  3. 我们可以编程连接Ethernet吗?

以上问题是通过Wifi完成的。 喜欢

  1. 我们可以通过编程方式开启/关闭Wifi

  2. 我们可以通过编程方式启用/禁用Wifi

  3. 我们可以使用WifiManager编程方式连接Wifi

android是否提供任何EthernetManagerWifiManager来处理Ethernet

或者,如果这似乎不可行,那么我原来的要求是:

我要澄清的第一件事是“设备已根”。

我可以操纵设置(默认)吗? 就像我不希望除了WIFIEthernet之外的Settings.apk中的任何其他选项。 它应该只显示WifiEthernet 。 而已。 我可以从“设置”中禁用所有选项,还是可以从“设置”中删除所有其他选项?

    好的,这里是我用ETHERNET INTERFACE(eth0)操作的一些方法。

    1)检查以太网接口是否存在的方法

     public static boolean doesEthExist() { List list = getListOfNetworkInterfaces(); return list.contains("eth0"); } public static List getListOfNetworkInterfaces() { List list = new ArrayList(); Enumeration 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)检查ETHERNET是启用还是启用的方法

     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)根据所选types通过以太网连接的方法(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; } 

    我创建了另外一个类来存储所需的所有eth值。 然后使用用户插入的值初始化此类。

     public class StaticConnectionSettings { private String ip, netmask, dns, mac, gateway, type; //Getters and Setters } 

    这就是……我将很快测试它……这段代码缺少测试阶段(ping)。 也许它需要设置DNS。 但这可以很容易地完成。 我没有把它包括在内,因为我认为在我们的设备上它也可以在没有DNS设置的情况下工作。

    我将在这里介绍的解决方案是使用reflection的hack,并且仅适用于root系统。

    您的设备可能具有流行的android.net.ethernet包。 在活动中,试试

     Object emInstance = getSystemService("ethernet"); 

    它返回EthernetManager的有效实例或null。 Null意味着你运气不好。

    附加要求可能取决于您的设备:以太网和Wifi可能仅适用于您的设备。 您可能需要禁用Wifi以启用以太网,反之亦然。

    要通过reflection启用以太网,请使用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(); } 

    您的应用程序清单需要这些权限

       

    WRITE_SECURE_SETTINGS权限只能由系统应用获取。 该应用程序不需要由系统密钥签名。 它可以是任何有效的标志(如常规Android App导出function)。 使用busybox重新安装系统分区以进行写访问,并将apk移至/ system / app文件夹。 重新启动设备,它应该工作。

    我们可以编程连接以太网吗?

    没有接入点可以与Wifi连接。 您可以将其配置为DHCP或提供静态值。 这当然也可以通过reflection来完成。 您将需要EthernetDevInfo类。

    以太网管理器和EthernetDevInfo的实际实现可能在Android版本和设备之间略有不同,因为它不必符合公共API(还),甚至可能是自定义版本。 要获取getter和setter列表,您可以使用Introspector或reflection。

    三个回答你的上述问题:

    1. 是。 您可以尝试使用ifconfig eth0 down ; ifconfig eth0 up 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

    以及本讲座的YouTubevideo

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

    以及如何使用ifconfig for android的参考

    Android以太网使用dhcp配置IP

    因此,如果您find可能的解决方案,请分享! 如果我会在你认真之前做到这一点。