最近需要实现热点的自动,但是各种方式之后只能实现Android 8.0以下的稳定实现;
/**
* 自动开启热点工具,仅对Android 8以下有效
* <p>
* 需要以下权限才能正常使用
* <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
* <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
* <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
*
* @author jiangjunjie01
* Date: 2022/3/18
*/
public class HotPointHelper {
/**
* 开启便携热点
*/
public static boolean openAp(Context context) {
if (context == null) {
return false;
}
if (isApOn(context)) {
return false;
}
if (!checkPermission(context)) {
return false;
}
WifiManager wifimanager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifimanager == null) {
return false;
}
//开启热点需要关闭wifi
if (wifimanager.isWifiEnabled()) {
wifimanager.setWifiEnabled(false);
}
//需要设置一个自定义热点,不能直接使用 new WifiConfiguration() ,必须有配置信息
WifiConfiguration wifiConfiguration = createConfig("1", "1");
//使用反射开启Wi-Fi热点
Method method;
try {
method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wifimanager, wifiConfiguration, true);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 检查是否允许修改系统设置,需要 WRITE_SETTINGS 权限,无权限则跳转设置页面
*/
private static boolean checkPermission(Context context) {
//安卓6以上的特殊处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(context)) {
context.startActivity(new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS));
return false;
}
}
return true;
}
/**
* 检测是否打开了热点
*/
private static boolean isApOn(Context context) {
WifiManager wifimanager = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE);
if (wifimanager != null) {
Method method = null;
try {
method = wifimanager.getClass().getDeclaredMethod("isWifiApEnabled");
method.setAccessible(true);
return (boolean) method.invoke(wifimanager);
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 关闭便携热点
*/
private static void closeAp(Application context) {
try {
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wifimanager, null, false);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置有密码的热点信息
*/
private static WifiConfiguration createConfig(String SSID, String pwd) {
if (TextUtils.isEmpty(pwd)) {
return null;
}
WifiConfiguration config = new WifiConfiguration();
config.SSID = SSID;
config.preSharedKey = pwd;
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;
}
}