Programing

Wi-Fi가 Android에 연결되어 있는지 어떻게 알 수 있습니까?

lottogame 2020. 4. 15. 10:21
반응형

Wi-Fi가 Android에 연결되어 있는지 어떻게 알 수 있습니까?


사용자가 Wi-Fi에 연결되어 있지 않은 경우 다운로드를 시도하지 않기를 바랍니다. 그러나 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;
}

그러나 국가는 내가 기대하는 것이 아닙니다. Wi-Fi가 연결되어 있지만 OBTAINING_IPADDR상태로 표시됩니다.


ConnectivityManager를 사용하여 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 .

NOTE2 : public NetworkInfo getNetworkInfo (int networkType)이제 더 이상 사용되지 않습니다 :

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

NOTE3 : public static final int TYPE_WIFI이제 더 이상 사용되지 않습니다 :

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


방법 때문에 NetworkInfo.isConnected ()는 이제 중단API-23 , 여기에 무선 인터넷 어댑터에 있고 대신 WifiManager를 사용하는 액세스 포인트에 접속하는 경우를 검출하는 방법이다 :

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 ()를 호출 할 때 이러한 상태 중 하나를 반환합니다.

ASSOCIATED-연결 완료

ASSOCIATING-액세스 포인트와 연결하려고합니다.

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

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

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

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

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

비활성-비활성 상태.

INVALID-일반적으로 볼 수없는 의사 상태입니다.

스캔-네트워크 스캔.

UNINITIALIZED-연결되지 않았습니다.


활성 네트워크가 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
}

Root Toolbox PRO에서 라이센스 확인을 위해 if를 사용하는데 훌륭하게 작동하는 것 같습니다.


하지만 제이슨의 대답은 정확한지, 요즘 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;
}

사용 WifiManager당신이 할 수 있습니다 :

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

getNeworkId 메소드 는 네트워크에 연결되지 않은 경우에만 -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" />

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

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
            }
        }

    }
}

선입관도 추가하십시오


@Jason Knight와 비슷하지만 Kotlin 방식으로 :

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

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

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

PS 권한을 허용하기 위해 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()

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


다음과 같이 활성화되지 않은 경우 WIFI를 켤 수 있습니다. @Jason Knight가 응답 한 WIFI 상태를 확인하십시오. 2. 활성화되지 않은 경우 매니페스트 파일에 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();
}

}


많은 답변이 더 이상 사용되지 않는 코드 또는 더 높은 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 네트워크 상태에 대해 열거 형 클래스에 정의 된 Disable, EnabledNotConnected 및 Connected의 3 가지 값 중 하나를 반환합니다. 이를 통해 사용자에게 WiFi를 활성화하거나 이미 활성화 된 경우 사용 가능한 네트워크 중 하나에 연결하도록 알리는 등의 세부적인 결정을 내릴 수 있습니다. 그러나 필요한 모든 것이 WiFi 인터페이스가 네트워크에 연결되어 있는지 여부를 나타내는 부울이면 isWifiConnected () 함수가이를 제공합니다. 이전 항목을 사용하고 결과를 연결됨과 비교합니다.

이전 답변 중 일부에서 영감을 얻었지만 Android API의 진화 또는 천천히 증가하는 IP V6의 가용성으로 인한 문제를 해결하려고합니다. 트릭은 다음을 사용하는 것이 었습니다.

wifiManager.connectionInfo.bssid != null 

대신에:

  1. getIpAddress () == 0 IP V4에만 유효하거나
  2. getNetworkId () == -1 이제 다른 특수 권한이 ​​필요합니다 (Location)

설명서에 따르면 https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid 네트워크에 연결되어 있지 않으면 null을 반환합니다. 실제 값을 얻을 권한이 없어도 연결되어 있으면 null 이외의 값을 반환합니다.

또한 다음 사항에 유의하십시오.

android.os.Build.VERSION_CODES # 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)
    }
}

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

반응형