我对以太网有一个小问题。
我的三个问题是:
我们可以通过编程方式开启/关闭Ethernet
吗?
我们可以通过编程方式启用/停用Ethernet
吗?
我们可以通过编程方式连接Ethernet
吗?
上述问题是使用Wifi
完成的。喜欢
我们可以通过编程方式开启/关闭Wifi
。
我们可以通过编程方式启用/停用Wifi
。
我们可以使用Wifi
以编程方式连接WifiManager
。
Android是否提供了EthernetManager
作为WifiManager
来处理Ethernet
?
或者,如果这似乎不可行,那么我原来的要求是:
我要说清楚的第一件事是“设备已经生根”。
我可以操作设置(默认)吗?就像我不希望除Settings.apk
和WIFI
之外的Ethernet
中的任何其他选项。它应该只显示Wifi
和Ethernet
。而已。我可以从“设置”中禁用所有选项,还是可以从“设置”中删除所有其他选项?
答案 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)
对上述问题的三个回答:
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
关于如何使用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);