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