在Android中,很多地方都会用到getSystemService()方法去获取一个ServiceManager对象。对WIFI的操作也不列外。如果我们想要进行一系列的wifi操作,也需要先获取到这个对象。下面以具体代码来进行分析。
打开WIFI
我们知道,当我们想要连接一个热点进行上网的时候,我们需要做的第一件事就是打开我们的wifi。所以,下面让我们看看通过代码如何打开wifi。- 获取WifiManager对象
- 调用 wifiManager.setWifiEnabled(true)方法
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
打开wifi就这么简单,当然请别忘了去申请相应的权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORKE"/>
关闭WIFI
通过上面的打开wifi,你肯定已经猜到了怎样关闭wifi了吧。是的,只需要将参数改为true;wifiManager.setWifiEnabled(true);
创建热点
经过上面的两个体验,你可能已经觉得wifi的操作很简单了吧。不过,打开热点可能会稍微麻烦一点,因为,google把打开热点的api给hide(隐藏)了,也就是说这个方法你是无法在代码里面调用的,当然也就没办法实现创建热点的操作!然而办法还是有的,我们可以使用Java反射。因为只是把它隐藏了,并不代表它不存在。所以,我以通过反射得到相应的对象,进而调用相应方法创建热点。
代码如下:
public void createWifiHotspot(View view) {
if (wifiManager.isWifiEnabled()) {
//如果wifi处于打开状态,则关闭wifi,
wifiManager.setWifiEnabled(false);
}
WifiConfiguration config = new WifiConfiguration();
config.SSID = WIFI_HOTSPOT_SSID;
config.preSharedKey = "123456789";
config.hiddenSSID = true;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);//开放系统认证
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
//通过反射调用设置热点
try {
Method method = wifiManager.getClass().getMethod(
"setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
boolean enable = (Boolean) method.invoke(wifiManager, config, true);
if (enable) {
Log.d(TAG, "热点已开启 SSID:" + WIFI_HOTSPOT_SSID + " password:123456789");
} else {
Log.d(TAG, "创建热点失败");
}
} catch (Exception e) {
e.printStackTr败
因ace();
Log.d(TAG闭 }
}
- 关闭热点
为我们创建热点的时候使用了反射,所以关闭的时候我们也使用反射。
public void closeWifiHotspot(View view) {
try {
Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
method.setAccessible(true);
WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);
Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method2.invoke(wifiManager, config, false);
Log.d(TAG, "热点已关闭 SSID:");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
下一篇:WIFI 扫描和连接热点