Android 사용자 정의 연결 지정 WiFi & 핫스팟 스위치

9194 단어 Android
Android 사용자 정의 연결 지정 WiFi & 핫스팟 스위치
  • WiFi 연결
  • 핫스팟 스위치
  • WiFi 연결
  • 목적: 사용자가 입력한 WiFi SSID, 암호, 암호 유형 제어 장치를 통해 해당 WiFi에 연결할 수 있음
  • 단계: WiFi 켜기, WiFi 네트워크 검색 시작, WiFi 연결
  • 구체적인 실현 방식: (1) 와이파이 사용: 장치가 현재 와이파이를 켜고 있는지 확인하고, 켜지 않으면 와이파이를 켜고, 켜져 있고 연결된 상태라면 현재 연결을 끊은 다음에 라디오에 등록하여 와이파이 상태 변화 결과를 감청한다.WiFi를 켠 후 바로 WiFi 검색을 수행하지 않는 것이 좋습니다. WiFi 검색 결과를 브로드캐스트하지 못할 수 있습니다
  • .
    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 연결 완료
    핫스팟 스위치
  • 목적: 핫스팟을 켜거나 끄는 사용자 전환
  • 단계: 핫스팟의 현재 상태가 켜져 있는지 닫혀 있는지 판단하고 사용자의 선택에 따라 전환
  • 구체적인 실현 방식: (1) 핫이슈 상태 판단:
  • 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 및 네트워크 권한 외에 다음과 같은 권한이 필요합니다.
    
    

    이 권한은 시스템에만 적용되기 때문에, 응용 프로그램을 시스템 응용으로 컴파일해야 하며, 구체적인 방식은 인터넷의 방안을 볼 수 있다

    좋은 웹페이지 즐겨찾기