今天测试了3台手机, 分别是华为p9、1+3、小米note3,都要用户在应用管理界面设置 允许“修改系统设置”权限(WRITE_SETTINGS是特殊权限,无法动态申请)的前提下,才能开启热点,否则报没有授权WRITE_SETTINGS的异常。三台测试机的测试结果是,P9和1+手机能分享热点并被连接,小米note3能开启但是无法被连接成功(获取ip地址失败,原因应该是小米产商做了什么特殊处理)。
Android手机安全性提高了,但是也带来了各种限制。
主要代码如下:
public class ApManager {
/**
* 判断热点是否开启
*
* @param context
* @return
*/
public static boolean isApOn(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
try {
Method method = wifimanager.getClass().getDeclaredMethod("isWifiApEnabled");
method.setAccessible(true);
return (Boolean) method.invoke(wifimanager);
} catch (Throwable ignored) {
}
return false;
}
/**
* 关闭WiFi
*
* @param context
*/
public static void closeWifi(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
if (wifimanager.isWifiEnabled()) {
wifimanager.setWifiEnabled(false);
}
}
/**
* 开启热点
*
* @param context
* @param SSID 热点名称
* @param password 热点密码
* @return
*/
public static boolean openAp(Context context, String SSID, String password) {
if (TextUtils.isEmpty(SSID)) {
return false;
}
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
if (wifimanager.isWifiEnabled()) {
wifimanager.setWifiEnabled(false);
}
WifiConfiguration wifiConfiguration = getApConfig(SSID, password);
try {
if (isApOn(context)) {
wifimanager.setWifiEnabled(false);
closeAp(context);
}
Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(wifimanager, wifiConfiguration, true);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 关闭热点
*
* @param context
*/
public static void closeAp(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
try {
Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(wifimanager, null, false);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取开启热点后的IP地址
*
* @param context
* @return
*/
public static String getHotspotLocalIpAddress(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
DhcpInfo dhcpInfo = wifimanager.getDhcpInfo();
if (dhcpInfo != null) {
int address = dhcpInfo.serverAddress;
return ((address & 0xFF)
+ "." + ((address >> 8) & 0xFF)
+ "." + ((address >> 16) & 0xFF)
+ "." + ((address >> 24) & 0xFF));
}
return null;
}
/**
* 设置热点
*
* @param SSID 热点名称
* @param pwd 热点密码
* @return
*/
private static WifiConfiguration getApConfig(String SSID, String password) {
if (TextUtils.isEmpty(password)) {
return null;
}
WifiConfiguration config = new WifiConfiguration();
config.SSID = SSID;
config.preSharedKey = password;
// config.hiddenSSID = true;
config.status = WifiConfiguration.Status.ENABLED;
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
return config;
}
/**
* 开启热点
*/
public static void openHotspot(Context context, String ssid, String password) {
closeWifi(context);
if (isApOn(context)) {
closeAp(context);
}
openAp(context, ssid, password);
}
}