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

时间:2014-02-13 05:45:34

标签: android ethernet android-networking

我对以太网有一个小问题。

我的三个问题是:

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

  2. 我们可以通过编程方式启用/停用Ethernet吗?

  3. 我们可以通过编程方式连接Ethernet吗?

  4. 上述问题是使用Wifi完成的。喜欢

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

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

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

    4. Android是否提供了EthernetManager作为WifiManager来处理Ethernet

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

      我要说清楚的第一件事是“设备已经生根”。

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

4 个答案:

答案 0 :(得分:11)

这里有一些我使用以太网接口(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)检查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)根据所选类型(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设置的情况下工作。

答案 1 :(得分:11)

我将在这里介绍的解决方案是使用反射的hack,并且只能在root系统上运行。

您的设备可能包含流行的android.net.ethernet程序包。在活动中,尝试

Object emInstance = getSystemService("ethernet");

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

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

要通过反射启用以太网,请使用EthernetManager的实例。 要调用的方法是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();
    }

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

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

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

  

我们可以通过编程方式连接以太网吗?

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

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

答案 2 :(得分:0)

对上述问题的三个回答:

  1. 是。您可以尝试使用ifconfig eth0 down ; ifconfig eth0 up。但我还没有亲自测试过。
  2. 是的,但你没必要。 Android为您完成切换。如果您连接到WiFi,则以太网禁用。如果您已连接到WiFi并将以太网电缆插入设备;你只需要禁用WiFi(你知道如何)和Android自动切换到以太网。
  3. 不像你想的那么容易。我有同样的问题,直到现在我发现只有一个我还没有测试过的解决方案。由于android在linux内核上运行,我们可以使用ifconfig来操作以太网连接。
  4. 这里隐藏着一个解释: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

    本讲座的youtube视频

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

    关于如何使用ifconfig for android

    的参考资料

    Android ethernet configure IP using dhcp

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

答案 3 :(得分:0)

它适用于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);