代码在Android4.4及左右版本能够正常运行
1.添加开启热点所需要的权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
2.开启热点(4.4正常开启)。
public void createAp() {
//开启热点先关闭Wifi
closeWifi();
try {
WifiConfiguration apConfiguration = new WifiConfiguration();
apConfiguration.SSID = WifiAdmin.SSID;//热点名称
apConfiguration.preSharedKey = WifiAdmin.PassWord;//热点密码
apConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(mWifiManager, apConfiguration, true);
} catch (Exception e) {
e.printStackTrace();
}
}
3.解决方法一:在添加一个权限
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
在我的荣耀6(H60-L02)测试还是没有效果,依旧打不开。不知道其他手机可不可以。。。
private void createWifiAp() {
//开启热点先关闭Wifi
closeWifi();
try {
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.setAccessible(true);
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = WifiAdmin.SSID;
configuration.preSharedKey = WifiAdmin.PassWord;
configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
configuration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
method.invoke(mWifiManager, configuration, true);
} catch (Exception e) {
e.printStackTrace();
}
}
4.解决方法二:将targetSdkVersion改成22,在我手机上亲测有用。
开启热点代码
public void createAp() {
//开启热点先关闭Wifi
closeWifi();
try {
WifiConfiguration apConfiguration = new WifiConfiguration();
apConfiguration.SSID = WifiAdmin.SSID;
apConfiguration.preSharedKey = WifiAdmin.PassWord;
apConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(mWifiManager, apConfiguration, true);
} catch (Exception e) {
e.printStackTrace();
}
}
5.targetSdkVersion为22以下的时候会走老一套的流程,所以权限在Menifest声明了就可以不需要在动态申请权限
targetSdkVersion 如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值, 他会告诉
Android平台:此程序在此版本已经经过充分测,没有问题。不必为此程序开启兼容性检查判断的工作了。 也就是说,
如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。 但是,这个设置仅仅是一个声明、
一个通知,不会有太实质的作用, 比如说,使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低
版本中是不支持的 ,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,
此属性不会帮你解决兼容性的测试问题。 你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的
总之在6.0上开启热点,可能还是因为权限的原因导致无法开启。