如何检测WiFi网络共享状态

时间:2012-01-30 14:41:52

标签: android

我想知道如何检测WiFi网络共享的状态。我看过一篇文章:Android 2.3 wifi hotspot API但它不起作用!它总是返回WIFI_AP_STATE_DISABLED = 1.它不依赖于WiFi网络共享的真实状态。

5 个答案:

答案 0 :(得分:16)

使用反射:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for (Method method: wmMethods) {
  if (method.getName().equals("isWifiApEnabled")) {

    try {
      boolean isWifiAPenabled = method.invoke(wifi);
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
  }
}

正如您所见here

答案 1 :(得分:3)

首先,您需要获得WifiManager:

Context context = ...
final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

然后:

public static boolean isSharingWiFi(final WifiManager manager)
{
    try
    {
        final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled");
        method.setAccessible(true); //in the case of visibility change in future APIs
        return (Boolean) method.invoke(manager);
    }
    catch (final Throwable ignored)
    {
    }

    return false;
}

您还需要在AndroidManifest.xml中请求权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

答案 2 :(得分:2)

除了反思,要获得Wifi网络共享状态更新,您还可以收听此广播动作:

IntentFilter filter = new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED");

要获取所有网络共享选项更新:

IntentFilter filter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED");

这些操作隐藏在Android源代码

答案 3 :(得分:0)

如果有人在寻找Xamarin C#版本:

    static Method isWifiApEnabledMethod;

    public static bool IsWifiApEnabled ()
    {
        var wifiManager = WifiManager.FromContext (Application.Context);
        if (isWifiApEnabledMethod == null)
        {
            try
            {
                isWifiApEnabledMethod = wifiManager.Class.GetDeclaredMethod ("isWifiApEnabled");
                isWifiApEnabledMethod.Accessible = true; //in the case of visibility change in future APIs
            }
            catch (NoSuchMethodException e)
            {
                Debug.WriteLine ("Can't get method by reflection" + e);
            }
            catch (System.Exception ex)
            {
                Debug.WriteLine ("Can't get method by reflection" + ex);

            }
        }

        if (isWifiApEnabledMethod != null)
        {
            try
            {
                return (bool)isWifiApEnabledMethod.Invoke (wifiManager);
            }
            catch (System.Exception ex)
            {
                Debug.WriteLine ("Can't invoke by reflection" + ex);

            }
        }

        return false;
    }

答案 4 :(得分:0)

反思是实现这一目标的糟糕方法。

我们可以检查DhcpInfo以确定该设备是分配地址(移动热点)还是被其他DHCP服务器分配。

这是一个kotlin函数,它将确定设备是否是移动热点,因此尚未经过广泛测试,因此YMMV。

fun isMobileHotspot(manager: WifiManager): Boolean {
  val info = manager.dhcpInfo
  return (
      info.ipAddress == 0
          && info.netmask == 0
          && info.gateway == 0
          && info.serverAddress == 16885952) // 192.168.1.1
}