Android 사용자 정의 연결 지정 WiFi & 핫스팟 스위치
9194 단어 Android
public static void enableWifi(Context context, BroadcastReceiver wifiReceiver) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (!Objects.requireNonNull(wifiManager).isWifiEnabled()) {
//WiFi , wifi
wifiManager.setWifiEnabled(true);
} else {
//WiFi , , , 。 WiFi , WiFi
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null) {
wifiManager.disableNetwork(wifiInfo.getNetworkId());
wifiManager.disconnect();
}
wifiManager.scan();
}
// WiFi 、WiFi
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
context.registerReceiver(wifiReceiver, intentFilter);
}
(2) WiFi 검색 결과 생성, WiFi 상태 변경 브로드캐스트 수신
class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Objects.requireNonNull(action).equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
// , SSID WiFi,
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List scanResultList = Objects.requireNonNull(wifiManager).getScanResults();
for(ScanResult scanResult : scanResultList) {
if(scanResult.SSID.equals(ssid)) {
connectWifi(ssid, password, wifiCipherType, this)
}
}
} else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
//WiFi : WiFi , WiFi
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Objects.requireNonNull(wifiManager).startScan();
break;
case WifiManager.WIFI_STATE_DISABLED:
break;
default:break;
}
}
}
}
(3) 와이파이 연결: 스캔 결과가 나오면 와이파이 연결을 할 수 있습니다. 특히 와이파이 스캔을 하지 않으면 getConfiguredNetworks ()를 호출하면 빈 목록으로 돌아갑니다.WiFi 설정 리스트를 받은 후 리스트에 이 SSID의 WiFi 설정이 있는지 판단합니다. 만약에 이미 있다면 이전 설정을 그대로 사용하거나 설정과 현재 입력 정보가 일치하는지 더 판단할 수 있습니다. 일치하지 않으면 낡은 설정을 삭제하고 현재 설정을 사용하십시오. 만약에 SSID 설정이 지정되지 않으면 해당하는 설정을 만든 후에 연결합니다.
public static boolean connectWifi(Context context, String ssid, String password, WifiCipherType wifiCipherType, BroadcastReceiver wifiReceiver) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List wifiConfigurations = Objects.requireNonNull(wifiManager).getConfiguredNetworks();
for(WifiConfiguration wifiConfiguration : wifiConfigurations) {
if(wifiConfiguration.SSID.equals("\"" + ssid + "\"")) {
boolean isWifiEnable = wifiManager.enableNetwork(wifiConfiguration.networkId, true);
if(isWifiEnable) {
context.unregisterReceiver(wifiReceiver);
return true;
} else {
context.unregisterReceiver(wifiReceiver);
return false;
}
}
}
int netId = wifiManager.addNetwork(createWifiConfiguration(ssid, password, wifiCipherType));
boolean isWifiEnable = wifiManager.enableNetwork(netId, true);
if(isWifiEnable) {
context.unregisterReceiver(wifiReceiver);
return true;
}
context.unregisterReceiver(wifiReceiver);
return false;
}
(4) WIFI 설정을 만들고 설정 중의 SSID와 상기 비교 과정의 SSID는 모두'+ssid+''형식의 문자열로 사용해야 하며 그렇지 않으면 오류가 발생할 수 있습니다.WiFi 구성의 생성과 관련하여 이미 참조할 수 있는 코드가 많습니다. 여기에는 암호화, WEP, WPA/WPA2 암호화가 없는 구성만 나열됩니다.
private static WifiConfiguration createWifiConfiguration(String ssid, String password, WifiCipherType wifiCipherType) {
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.allowedAuthAlgorithms.clear();
wifiConfiguration.allowedGroupCiphers.clear();
wifiConfiguration.allowedKeyManagement.clear();
wifiConfiguration.allowedPairwiseCiphers.clear();
wifiConfiguration.allowedProtocols.clear();
wifiConfiguration.SSID = "\"" + ssid + "\"";
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
if(wifiCipherType == WifiCipherType.WIFI_CIPHER_NOPASS) {
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.wepTxKeyIndex = 0;
} else if(wifiCipherType == WifiCipherType.WIFI_CIPHER_WEP) {
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.wepKeys[0]= "\"" + password + "\"";
wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.wepTxKeyIndex = 0;
} else if (wifiCipherType == WifiCipherType.WIFI_CIPHER_WPA_PSK) {
wifiConfiguration.preSharedKey = "\"" + password + "\"";
wifiConfiguration.hiddenSSID = false;
wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
}
return wifiConfiguration;
}
위 단계를 통해 WiFi 연결 완료
핫스팟 스위치
public static boolean isWifiApEnabled() {
WifiManager wifiManager = (WifiManager) Utils.getApp().getSystemService(Context.WIFI_SERVICE);
try {
Method method = Objects.requireNonNull(wifiManager).getClass().getMethod("isWifiApEnabled");
method.setAccessible(true);
return (Boolean) method.invoke(wifiManager);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
(2) 핫스팟 스위치: Android 7.1,Android7.1의 스위치 핫스팟 방안은 다른 버전과 다르기 때문에 구덩이를 밟기 쉽다. 이 방법은 다음과 같다.https://blog.csdn.net/zhang01/article/details/79222057다른 버전의 핫스팟 스위치에 대해서는 인터넷 내용이 비교적 많으므로, 일일이 군말하지 않겠다.
public static boolean setWifiAp(boolean isOpen) {
ConnectivityManager connectivityManager = (ConnectivityManager) Utils.getApp().getSystemService(Context.CONNECTIVITY_SERVICE);
try {
Field mField = Objects.requireNonNull(connectivityManager).getClass().getDeclaredField("TETHERING_WIFI");
mField.setAccessible(true);
int mTETHERING_WIFI = (int)mField.get(connectivityManager);
Field iConnMgrField = connectivityManager.getClass().getDeclaredField("mService");
iConnMgrField.setAccessible(true);
Object iConnMgr = iConnMgrField.get(connectivityManager);
Class> iConnMgrClass = Class.forName(iConnMgr.getClass().getName());
Method mStartTethering1 = iConnMgrClass.getMethod("startTethering", int.class,ResultReceiver.class,boolean.class);
mStartTethering1.setAccessible(true);
mStartTethering1.invoke(iConnMgr, mTETHERING_WIFI, null, isOpen);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
여기서 주의해야 할 것은 WiFi 및 네트워크 권한 외에 다음과 같은 권한이 필요합니다.
이 권한은 시스템에만 적용되기 때문에, 응용 프로그램을 시스템 응용으로 컴파일해야 하며, 구체적인 방식은 인터넷의 방안을 볼 수 있다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.