web-dev-qa-db-ja.com

プログラムによるイーサネット接続(Android)(ルート化されたデバイス)

Ethernetに関して小さな問題があります。

私の3つの質問は:

  1. プログラムでEthernetをオン/オフにできますか?

  2. プログラムでEthernetを有効/無効にできますか?

  3. プログラムでEthernetに接続できますか?

上記の質問はWifiで行われます。同様

  1. プログラムでオン/オフを切り替えることができますWifi

  2. プログラムでWifiを有効/無効にすることができます。

  3. Wifiを使用して、プログラムでWifiManagerに接続できます。

AndroidはEthernetManagerなどのWifiManagerを提供してEthernetを処理しますか?

または、これが実行可能ではないように思われる場合、私の元の要件は次のとおりです。

最初にクリアするのは、「デバイスIS ROOTED」です。

設定を操作できますか(デフォルト)? WIFIEthernet以外のオプションがSettings.apkに必要ないように。 WifiEthernetのみが表示されます。それでおしまい。設定からすべてのオプションを無効にできますか、それとも設定から他のすべてのオプションを削除できますか?

19
Manohar Perepa

ここで紹介する解決策は、リフレクションを使用したハックであり、ルート化されたAndroidシステムでのみ機能します。

お使いのデバイスには、人気の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アプリエクスポート機能など)。busyboxを使用して書き込みアクセス用にシステムパーティションを再マウントし、apkを/ system/appフォルダに移動します。デバイスを再起動しますそしてそれはうまくいくはずです。

プログラムでイーサネットを接続できますか?

Wifiに接続するためのアクセスポイントがありません。 DHCP用に構成するか、静的な値を指定します。もちろん、これはリフレクションを介して行うこともできます。そのためには、EthernetDevInfoクラスが必要です。

EthernetManagerとEthernetDevInfoの実際の実装は、Androidバージョンとデバイス間でわずかに異なる場合があります。これは、パブリックAPIに(まだ)準拠する必要がなく、カスタムバージョンでさえある可能性があるためです。 Introspector または一般的なリフレクションを使用できるゲッターとセッターのリスト。

12
Robin Gawenda

ここで、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)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値を格納するために作成したクラスがもう1つあります。このクラスは、ユーザーが挿入した値で初期化されます。

public class StaticConnectionSettings {

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

//Getters and Setters
}

これで終わりです...すぐにテストします...このコードにはテスト段階(ping)がありません。そして多分それはDNSの設定が必要です。しかし、これは簡単に行うことができます。私のデバイスではDNS設定がなくても機能すると思うので、含めていません。

11
MTurPash

上記の質問に対する3つの回答:

  1. はい。 ifconfig eth0 down ; ifconfig eth0 up。しかし、私はまだ自分でテストしていません。
  2. はい、しかし必要はありません。 Androidが切り替えを行います。WiFiに接続すると、イーサネットが無効になります。すでにWiFiに接続していて、イーサネットケーブルをデバイスに接続している場合は、WiFiを無効にするだけです(これはあなたは方法を知っています)とAndroidは自動的にイーサネットに切り替わります。
  3. 思っているほど簡単ではありません。私は同じ問題を抱えており、今まで私はまだテストしていないソリューションを1つだけ見つけました。 AndroidはLinuxカーネルで実行されるため、イーサネット接続を操作するためにifconfigを使用できます。

説明はここに隠されています: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf

そして、この講義のyoutubeビデオ

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

Android向けのifconfigの使用方法に関するリファレンス

dhcpを使用してAndroidイーサネット構成IP

ですから、考えられる解決策を見つけたら、共有してください!!私があなたの前にそれをするなら、私は保証します。

0
MTurPash

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