programing

Wi-Fi가 안드로이드에 연결되어 있는지 확인하려면 어떻게 해야 합니까?

codeshow 2023. 8. 10. 21:46
반응형

Wi-Fi가 안드로이드에 연결되어 있는지 확인하려면 어떻게 해야 합니까?

와이파이가 연결되어 있지 않으면 사용자가 다운로드를 시도조차 하지 않았으면 합니다.하지만 와이파이가 활성화되어 있는지만 알 수 있을 뿐 3G 연결은 가능할 것 같습니다.

android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
    return false;
}

하지만, 그 상태는 제가 기대했던 것과 다릅니다.와이파이가 연결되어 있는데도 계속 연결이 됩니다.OBTAINING_IPADDR

연결 관리자를 사용하여 Wi-Fi 어댑터의 상태를 확인할 수 있어야 합니다.거기에서 연결되어 있는지, 사용 가능한지 확인할 수 있습니다.

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (mWifi.isConnected()) {
    // Do whatever
}

참고: 추가해야 하는 사항은 (여기 있는 N00bies의 경우) 참고해야 합니다.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

당신에게

AndroidManifest.xml을 사용하여 작동합니다.

참고 2: 이제 더 이상 사용되지 않습니다.

이 방법은 API 레벨 23에서 더 이상 사용되지 않습니다.이 메서드는 동일한 유형의 연결된 여러 네트워크를 지원하지 않습니다.getAllNetworks() 및 getNetworkInfo(android.net 를 사용합니다.대신 네트워크)가 필요로 합니다.

참고 3: 이제 더 이상 사용되지 않습니다.

이 상수는 API 레벨 28에서 더 이상 사용되지 않습니다.응용 프로그램은 대신 NetworkCapabilities.hasTransport(int)를 사용하거나 네트워크(NetworkRequest, NetworkCallback)를 요청하여 적절한 네트워크를 요청해야 합니다.지원되는 전송에 사용됩니다.

NetworkInfo.isConnected() 메서드는 이제 API-23에서 더 이상 사용되지 않으므로 Wi-Fi 어댑터가 켜져 있는지 여부를 감지하고 대신 WiFi Manager를 사용하여 액세스 포인트에 연결하는 방법은 다음과 같습니다.

private boolean checkWifiOnAndConnected() {
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        if( wifiInfo.getNetworkId() == -1 ){
            return false; // Not connected to an access point
        }
        return true; // Connected to an access point
    }
    else {
        return false; // Wi-Fi adapter is OFF
    }
}

다음을 사용합니다.

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();

getSupplicantState()를 호출할 때 다음 상태 중 하나를 반환합니다.

연결됨 - 연결이 완료되었습니다.

연결 - 액세스 지점과 연결하려고 합니다.

완료됨 - 모든 인증이 완료되었습니다.

연결 끊김 - 이 상태는 클라이언트가 연결되어 있지 않지만 액세스 지점을 찾기 시작할 가능성이 있음을 나타냅니다.

휴면 - 클라이언트가 명시적인 DISCONNECT 명령을 실행할 때 보고되는 Android 추가 상태입니다.

FOUR_WAY_HANDSHAKE - WPA 4방향 키 핸드셰이크 진행 중.

GROUP_HANDSHAKE - WPA 그룹 키 핸드셰이크가 진행 중입니다.

비활성 - 비활성 상태입니다.

잘못된 - 일반적으로 절대로 표시되어서는 안 되는 유사 상태입니다.

검색 - 네트워크를 검색합니다.

초기화 취소 - 연결이 없습니다.

활성 네트워크가 Wi-Fi인지 확인하기 위해 앱에서 이 기능을 사용하고 있습니다.

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{

    // Do your work here

}

저는 다음과 같은 몇 가지 질문을 보고 다음과 같이 생각해냈습니다.

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isConnected()){
    // If Wi-Fi connected
}

if (mobile.isConnected()) {
    // If Internet connected
}

루트 도구 상자 PRO에서 라이센스 검사를 위해 if를 사용하는데, 잘 작동하는 것 같습니다.

이 클래스는 API 레벨 29에서 및 와 같은 관련 액세스 방법과 함께 사용되지 않습니다.

설명서는 이제 비동기 콜백 모니터링 또는 네트워크 정보의 동기화된 액세스를 위해 API를 사용할 것을 제안합니다.

호출자는 대신 연결 관리자를 사용해야 합니다.연결 변경에 대해 알아보려면 NetworkCallback API를 사용하거나, 정보를 동기화하려면 ConnectivityManager#getNetworkCapabilities 또는 ConnectivityManager#getLinkProperties를 사용하도록 전환합니다.


WiFi가 연결되어 있는지 확인하기 위해 사용하는 코드는 다음과 같습니다.

코틀린:

val connMgr = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
connMgr?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val network: Network = connMgr.activeNetwork ?: return false
    val capabilities = connMgr.getNetworkCapabilities(network)
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
    val networkInfo = connMgr.activeNetworkInfo ?: return false
    return networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI
}

Java:

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr == null) {
    return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Network network = connMgr.getActiveNetwork();
    if (network == null) return false;
    NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

매니페스트 파일에도 사용 권한을 추가해야 합니다.

Jason의 대답은 맞지만, 요즘 getNetWorkInfo(int)는 더 이상 사용하지 않는 방법입니다.다음 기능은 좋은 대안이 될 것입니다.

public static boolean isWifiAvailable (Context context)
{
    boolean br = false;
    ConnectivityManager cm = null;
    NetworkInfo ni = null;

    cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ni = cm.getActiveNetworkInfo();
    br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));

    return br;
}

대부분의 답변은 사용되지 않는 코드 또는 상위 API 버전에서 사용할 수 있는 코드를 사용합니다.지금은 이런 걸 사용합니다.

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(connectivityManager != null) {
            for (Network net : connectivityManager.getAllNetworks()) {
                NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
                if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
                    return true;
            }
        }
        return false;

다음 코드(Kotlin)는 API 21부터 적어도 최신 API 버전(API 29)까지 작동합니다.함수 getWifiState()는 WiFi 네트워크 상태에 대해 가능한 세 가지 값 중 하나를 반환합니다.Enum 클래스에 정의된 Disable, EnabledNotConnected 및 Connected.이를 통해 WiFi를 활성화하거나 이미 활성화된 경우 사용 가능한 네트워크 중 하나에 연결하도록 사용자에게 알리는 등 보다 세부적인 결정을 내릴 수 있습니다.그러나 WiFi 인터페이스가 네트워크에 연결되어 있는지 여부를 나타내는 부울만 있으면 다른 함수인 WiFiConnected()가 이를 제공합니다.이전 버전을 사용하고 결과를 연결됨과 비교합니다.

이전 답변의 일부에서 영감을 얻었지만 Android API의 발전 또는 IPv6의 가용성 증가로 인해 발생한 문제를 해결하기 위해 노력하고 있습니다.비결은 다음과 같습니다.

wifiManager.connectionInfo.bssid != null 

다음 대신:

  1. getIpAddress() == IPv4에만 유효한 0 또는
  2. 이제 다른 특수 권한(위치)이 필요한 getNetworkId() == -1

문서 https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid 에 따르면 네트워크에 연결되어 있지 않으면 null을 반환합니다.그리고 실제 값을 가져올 수 있는 권한이 없더라도 연결되어 있으면 null이 아닌 다른 값을 반환합니다.

또한 다음 사항도 고려해야 합니다.

Android.os 이전 릴리스.Build.VERSION_CODEDS#N. 이 개체는 Context#getApplicationContext()에서만 가져와야 하며 호출 프로세스 내의 메모리 누수를 방지하기 위해 파생된 다른 컨텍스트에서는 가져오지 않아야 합니다.

매니페스트에서 다음을 추가하는 것을 잊지 마십시오.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

제안된 코드는 다음과 같습니다.

class MyViewModel(application: Application) : AndroidViewModel(application) {

   // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext

   // Define the different possible states for the WiFi Connection
    internal enum class WifiState {
        Disabled,               // WiFi is not enabled
        EnabledNotConnected,    // WiFi is enabled but we are not connected to any WiFi network
        Connected,              // Connected to a WiFi network
    }

    // Get the current state of the WiFi network
    private fun getWifiState() : WifiState {

        val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        return if (wifiManager.isWifiEnabled) {
                    if (wifiManager.connectionInfo.bssid != null)
                        WifiState.Connected
                    else
                        WifiState.EnabledNotConnected
               } else {
                    WifiState.Disabled
               }
    }

    // Returns true if we are connected to a WiFi network
    private fun isWiFiConnected() : Boolean {
        return (getWifiState() == WifiState.Connected)
    }
}

이것은 Q 이전과 이후의 Android 장치에서 작동합니다.

fun isWifiConnected(context: Context):Boolean {
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
             capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)==true
        } else {
            val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
            activeNetwork?.typeName?.contains("wifi",ignoreCase = true)?:false
        }
}

사용.WifiManager할 수 있는 일:

WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}

getNetworkId 메서드는 네트워크에 연결되어 있지 않은 경우에만 -1을 반환합니다.

ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
                  ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
                    ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
    Toast.makeText(
        getApplicationContext(),
        "Please make sure, your network connection is ON ",
        Toast.LENGTH_LONG).show();
}
else {
    // Put your function() to go further;
}

이 방법을 사용해 보세요.

public boolean isInternetConnected() {
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean ret = true;
    if (conMgr != null) {
        NetworkInfo i = conMgr.getActiveNetworkInfo();

        if (i != null) {
            if (!i.isConnected()) {
                ret = false;
            }

            if (!i.isAvailable()) {
                ret = false;
            }
        }

        if (i == null)
            ret = false;
    } else
        ret = false;
    return ret;
}

이 방법은 인터넷 연결이 가능한지 여부를 찾는 데 도움이 됩니다.

이것은 나에게 도움이 됩니다.

    ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    // Mobile
    State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

    // Wi-Fi
    State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

    // And then use it like this:

    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
    }
    else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled  :) ....",Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
    }

다음 권한을 추가합니다.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

@Jason Knight 답변과 비슷하지만 코틀린 방식으로:

val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

if (mWifi.isConnected) {
     // Do whatever
}

앱에서 유틸리티 방법으로 사용하는 내용은 다음과 같습니다.

public static boolean isDeviceOnWifi(final Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi != null && mWifi.isConnectedOrConnecting();
}

새로운 버전의 Android

private void getWifiInfo(Context context) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = connManager.getAllNetworks();

    if(networks == null || networks.length == 0)
        return;

    for( int i = 0; i < networks.length; i++) {
        Network ntk = networks[i];
        NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
        if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            if (connectionInfo != null) {
                // add some code here
            }
        }

    }
}

권한도 추가합니다.

이것이 더 쉬운 해결책입니다.Android에서 Wi-Fi 사용 여부 확인을 참조하십시오. 스택 오버플로 질문을 참조하십시오.

추신: 권한을 허용하기 위해 manifest.xml 파일에 코드를 추가하는 것을 잊지 마십시오.아래와 같이.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>

해라

wifiManager.getConnectionInfo().getIpAddress()

장치가 사용 가능한 연결이 될 때까지 0을 반환합니다(내 컴퓨터에서는 Samsung SM-T280, Android 5.1.1).

다음과 같이 활성화되지 않은 경우 WIFI를 켤 수 있습니다. 1. @Jason Knight의 답변대로 WIFI 상태를 확인하십시오. 활성화되지 않은 경우 매니페스트 파일에 WIFI 권한을 추가하는 것을 잊지 마십시오.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

당신의 자바 수업은 그렇게 되어야 합니다.

public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //check WIFI activation
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected() == false) {
        showWIFIDisabledAlertToUser();
    }
    else {
        Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
    }
}


private void showWIFIDisabledAlertToUser(){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
            .setCancelable(false)
            .setPositiveButton("Goto Settings Page To Enable WIFI",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int id){
                            Intent callGPSSettingIntent = new Intent(
                                    Settings.ACTION_WIFI_SETTINGS);
                            startActivity(callGPSSettingIntent);
                        }
                    });
    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int id){
                    dialog.cancel();
                }
            });
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

}

JAVA용으로 추가:

public boolean CheckWifiConnection() {
        ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false;
        }
    }

매니페스트 파일에 다음 권한을 추가합니다.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

오래된 질문이지만 이것이 제가 사용하는 것입니다.min api 레벨 21이 필요합니다. 또한 더 이상 사용되지 않는 Networkinfo apps도 마찬가지입니다.

boolean isWifiConn = false;
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = connMgr.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
        if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            isWifiConn = true;
            Toast.makeText(context,"Wifi connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context,"Wifi not connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }
    } else {
        for (Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
                isWifiConn = true;
                Toast.makeText(context,"Wifi connected ",Toast.LENGTH_LONG).show();
                break;
            }else{
                Toast.makeText(context,"Wifi not connected ",Toast.LENGTH_LONG).show();
            }
        }
    }
    return isWifiConn;
val wifi = context!!.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?        
         if (wifi!!.isWifiEnabled) 
              //do action here
    
         else 
             //do action here
    
        
                    

이 기능은 최신 버전의 Android에서 작동합니다.

fun getConnectionType(context: Context): ConnectivityType {
    var result = NONE
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
            if (capabilities != null) {
                when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                        result = WIFI
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                        result = MOBILE_DATA
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> {
                        result = VPN
                    }
                }
            }
        }
    } else {
        if (cm != null) {
            val activeNetwork = cm.activeNetworkInfo
            if (activeNetwork != null) {
                // connected to the internet
                when (activeNetwork.type) {
                    ConnectivityManager.TYPE_WIFI -> {
                        result = WIFI
                    }
                    ConnectivityManager.TYPE_MOBILE -> {
                        result = MOBILE_DATA
                    }
                    ConnectivityManager.TYPE_VPN -> {
                        result = VPN
                    }
                }
            }
        }
    }
    return result
}

enum class ConnectivityType {
    NONE,
    MOBILE_DATA,
    WIFI,
    VPN,
}

그리고 매니페스토에서:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

언급URL : https://stackoverflow.com/questions/3841317/how-do-i-see-if-wi-fi-is-connected-on-android

반응형