Включение точки доступа Wi-Fi программно и получение ошибки WiFi - PullRequest
0 голосов
/ 13 ноября 2018

Я использую следующий код из предыдущего поста в 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 через код, вышеуказанная функция возвращает "" пустую строку.

1 Ответ

0 голосов
/ 06 августа 2019

192.168.43.1 - это правильный IP-адрес, который должен быть возвращен, если ваше устройство включает горячую точку программно или вручную. Поскольку IP-адрес для устройства Android не меняется.

P.S: Если только у него нет андроида или устройств Google Pixel.

Используйте следующий код, чтобы включить вашу точку доступа. Это отражение с помощью частных API Android. Это не рекомендуется, но если у вас нет вариантов, возможно, вы захотите пойти по этому пути:

 public boolean setWifiEnabled(WifiConfiguration wifiConfig, boolean enabled) { 
    try {   
      if (enabled) { //disables wifi hotspot if it's already enabled    
        wifiManager.setWifiEnabled(false);  
      } 

       Method method = wifiManager.getClass()   
          .getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);   
      return (Boolean) method.invoke(wifiManager, wifiConfig, enabled); 
    } catch (Exception e) { 
      Log.e(this.getClass().toString(), "", e); 
      return false; 
    }   
  }

А вот код, который вы можете использовать для получения IP-адреса. Прекрасно работает на всех устройствах от API 15 до Pie. Протестировал его на моем демонстрационном приложении Spotserve .

  private String getIpAddress() {
    Log.v("DANG", "Inside getIpAdress()");
    String ip = "";
    try {
      Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
          .getNetworkInterfaces();
      while (enumNetworkInterfaces.hasMoreElements()) {
        NetworkInterface networkInterface = enumNetworkInterfaces
            .nextElement();
        Enumeration<InetAddress> enumInetAddress = networkInterface
            .getInetAddresses();
        while (enumInetAddress.hasMoreElements()) {
          InetAddress inetAddress = enumInetAddress.nextElement();

          if (inetAddress.isSiteLocalAddress()) {
            ip += inetAddress.getHostAddress() + "\n";
          }
        }
      }
      //To remove extra characters from IP for Android Pie
      if (ip.length() > 14) {
        for (int i = 15, j = 12; i < 18; i++, j++) {
          if ((ip.charAt(i) == '.')) {
            ip = ip.substring(0, j + 1);
            break;
          }
        }
      }
    } catch (SocketException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      ip += "Something Wrong! " + e.toString() + "\n";
    }

    Log.v("DANG", "Returning : " + "http://" + ip);
    return "http://" + ip;
  }
...