Подключение через Ethernet через программную (Android) (укорененное устройство)
У меня есть небольшая проблема в отношении Ethernet.
Мои три вопроса:
-
Можно ли программно включить/выключить Ethernet
?
-
Можем ли мы программно включить/отключить Ethernet
?
-
Можем ли мы программно подключиться Ethernet
?
Вышеупомянутые вопросы выполняются с помощью Wifi
. Как
-
Мы можем программно включить/выключить Wifi
.
-
Мы можем программно включить/отключить Wifi
.
-
Мы можем программно подключить Wifi
с помощью WifiManager
.
Поддерживает ли андроид любой EthernetManager
как WifiManager
для обработки Ethernet
?
Или, если это не представляется возможным, то мое первоначальное требование:
Первое, что я собираюсь убрать, - "УСТРОЙСТВО КРОМЕ".
Могу ли я манипулировать настройками (по умолчанию)? Например, мне не нужен другой вариант в Settings.apk
кроме Wifi
и Ethernet
. Он должен показывать только Wifi
и Ethernet
. Это. Могу ли я отключить все параметры из настроек или Могу ли я удалить все остальные параметры из настроек?
Ответы
Ответ 1
Решение, которое я здесь представляю, - это взлом, использующий отражение, и работает только на корневой системе Android.
На вашем устройстве может быть популярный пакет android.net.ethernet. В Управлении попробуйте
Object emInstance = getSystemService("ethernet");
Он возвращает действительный экземпляр EthernetManager или null. Null означает, что вам не повезло.
Дополнительное требование может зависеть от вашего устройства: Ethernet и Wi-Fi могут работать только исключительно. Возможно, вам придется отключить Wi-Fi для включения Ethernet и наоборот.
Чтобы включить Ethernet путем отражения, используйте ваш экземпляр 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();
}
Ваш манифест приложения нуждается в этих разрешениях
<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. Перезагрузите устройство, и оно должно работать.
Можно ли программно подключить Ethernet?
Нет точки доступа для подключения к Wi-Fi. Вы либо настраиваете его для DHCP, либо статические значения. Конечно, это можно сделать и через отражение.
Для этого вам понадобится класс EthernetDevInfo.
Фактическая реализация EthernetManager и EthernetDevInfo может немного отличаться между версиями Android и устройствами, поскольку она не должна соответствовать публичному api (пока) и может быть даже нестандартной версией.
Чтобы получить список геттеров и сеттеров, вы можете использовать Introspector или отражение вообще.
Ответ 2
Хорошо вот некоторые методы, которые я сделал для манипуляции с ETHERNET INTERFACE (eth0).
1) Метод проверки наличия интерфейса Ethernet
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) Способ включения или отключения Ethernet в зависимости от состояния, в котором он находится
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) Способ подключения через Ethernet в зависимости от выбранного типа (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;
}
Существует еще один класс, который я создал для хранения всех необходимых значений. Этот класс инициализируется значениями, которые пользователь вставляет.
public class StaticConnectionSettings {
private String ip, netmask, dns, mac, gateway, type;
//Getters and Setters
}
Это он... Я проверю его в ближайшее время... Этот код не имеет тестовой фазы (ping). И, возможно, ему нужна настройка DNS. Но это можно сделать легко. Я не включил его, потому что думаю, что на нашем устройстве он будет работать и без настройки DNS.
Ответ 3
Три Отвечает на следующие вопросы:
- Да. Вы можете попробовать использовать
ifconfig eth0 down ; ifconfig eth0 up
. Но я еще не тестировал его еще.
- Да, но вам этого не нужно. Android делает переключение для вас. Если вы подключаетесь к WiFi, отключается Ethernet. Если вы уже подключены к Wi-Fi, и вы подключаете кабель Ethernet к устройству; вам нужно только отключить Wi-Fi (который вы знаете, как это сделать), и андроид автоматически переключится на ethernet.
- Не так просто, как вы думаете. У меня такая же проблема, и до сих пор я нашел только одно решение, которое я еще не тестировал. Поскольку андроид работает на ядре linux, мы можем использовать ifconfig для управления соединением ethernet.
Объяснение скрывается здесь:
http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf
И видео youtube этой лекции
http://www.youtube.com/watch?v=LwI2NBq7BWM
И ссылка на использование ifconfig для android
Android ethernet настраивает IP-адрес с помощью dhcp
Итак, если вы придете к возможному решению, поделитесь им! Если я сделаю это до вас, я буду уверенно.