Я использую следующий код из предыдущего поста в StackOverflow относительно этой проблемы,
public static boolean configApState(Context context) {
WifiManager wifimanager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wificonfiguration = null;
try {
// if WiFi is on, turn it off
if(isApOn(context)) {
if (wifimanager != null) {
wifimanager.setWifiEnabled(false);
}
}
Method method = wifimanager != null ? wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class) : null;
if (method != null) {
method.invoke(wifimanager, null, !isApOn(context));
}else{
return false;
}
return true;
}
catch (Exception e) {
e.printStackTrace();
}
return false;
}
Кажется, работает отлично. Я использую этот код на Android TV Box X96 mini. Начиная с Android 7.0, я использую статический IP.
Но когда я пытаюсь подключиться автоматически, тогда DHCP на Android TV выдает очень странный IP для подключаемого устройства.
Я получаю 169.254.68.26
С другой стороны, если я пытаюсь пропинговать устройство, которое подключено через статический IP 192.168.43.50 , это дает мне
PING: передача не удалась. Общий сбой. Сообщение об ошибке.
С другой стороны, если я пытаюсь вручную включить точку доступа Wi-Fi из меню настроек, то полученный IP-адрес нормальный, и пинг также работает нормально. Я снова выключаю горячую точку и пытаюсь включить горячую точку через приложение, после чего она показывает то же самое вышеупомянутое поведение.
Есть что-то, чего мне не хватает?
Вот класс обслуживания, в котором я использую вышеупомянутую функцию
public class MyPersistingService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(),""+AppManager.isApOn(getApplicationContext()),Toast.LENGTH_LONG).show();
if(!AppManager.isApOn(getApplicationContext())) {
WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifi != null) {
wifi.setWifiEnabled(false);
AppManager.configApState(getApplicationContext());
}else{
Toast.makeText(getApplicationContext(), "No Wifi Found", Toast.LENGTH_SHORT).show();
}
}
return START_STICKY;
}}
Редактировать
Я пробовал следующую функцию в обоих случаях, чтобы получить IP-адрес
public static String getIPInfo2(Context context) throws SocketException {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
String finalIP = "";
while (interfaces.hasMoreElements())
{
NetworkInterface networkInterface = interfaces.nextElement();
if (networkInterface.isLoopback())
continue; // Don't want to broadcast to the loopback interface
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses())
{
InetAddress broadcast = interfaceAddress.getBroadcast();
InetAddress ip = interfaceAddress.getAddress();
// interfaceAddress.getNetworkPrefixLength() is another way to express subnet mask
// Android seems smart enough to set to null broadcast to
// the external mobile network. It makes sense since Android
// silently drop UDP broadcasts involving external mobile network.
if (broadcast == null)
continue;
finalIP = ip.getHostAddress();
}
}
return finalIP;
}
и я заметил странное поведение.
Когда я на Hotspot привязываю вручную из настроек. Эта функция возвращает
192.168.43.1 , но когда я включаю Wi-Fi через код, вышеуказанная функция возвращает "" пустую строку.