Ethernetに関して小さな問題があります。
私の3つの質問は:
プログラムでEthernet
をオン/オフにできますか?
プログラムでEthernet
を有効/無効にできますか?
プログラムでEthernet
に接続できますか?
上記の質問はWifi
で行われます。同様
プログラムでオン/オフを切り替えることができますWifi
。
プログラムでWifi
を有効/無効にすることができます。
Wifi
を使用して、プログラムでWifiManager
に接続できます。
AndroidはEthernetManager
などのWifiManager
を提供してEthernet
を処理しますか?
または、これが実行可能ではないように思われる場合、私の元の要件は次のとおりです。
最初にクリアするのは、「デバイスIS ROOTED」です。
設定を操作できますか(デフォルト)? WIFI
とEthernet
以外のオプションがSettings.apk
に必要ないように。 Wifi
とEthernet
のみが表示されます。それでおしまい。設定からすべてのオプションを無効にできますか、それとも設定から他のすべてのオプションを削除できますか?
ここで紹介する解決策は、リフレクションを使用したハックであり、ルート化された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 または一般的なリフレクションを使用できるゲッターとセッターのリスト。
ここで、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設定がなくても機能すると思うので、含めていません。
上記の質問に対する3つの回答:
ifconfig eth0 down ; ifconfig eth0 up
。しかし、私はまだ自分でテストしていません。説明はここに隠されています: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf
そして、この講義のyoutubeビデオ
http://www.youtube.com/watch?v=LwI2NBq7BWM
Android向けのifconfigの使用方法に関するリファレンス
ですから、考えられる解決策を見つけたら、共有してください!!私があなたの前にそれをするなら、私は保証します。
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);