networking 안드로이드 fragment - Android에서 인터넷 액세스를 확인하는 방법은 무엇입니까? InetAddress는 절대로 시간 초과되지 않습니다.





15 Answers

장치가 비행기 모드 (또는 사용 가능한 네트워크가없는 다른 상황에서) 인 경우 cm.getActiveNetworkInfo()null 이되므로 null 확인을 추가해야합니다.

수정 된 ( 에디 솔루션 ) 아래 :

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

또한 AndroidManifest.xml 다음 권한을 추가하십시오.

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

또 하나의 작은 점으로, 특정 시점에 네트워크 연결이 절대적으로 필요한 경우 netInfo.isConnectedOrConnecting 대신 netInfo.isConnected() 를 사용하는 것이 netInfo.isConnectedOrConnecting . 그러나 이것은 개별 사용 사례에 달려 있다고 생각합니다.

actionbar

호스트 이름에 대한 네트워크 액세스를 확인해야하는 AsyncTask 가 있습니다. 그러나 doInBackground() 는 절대로 타임 아웃되지 않습니다. 누구나 단서가 있습니까?

public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {

    private Main main;

    public HostAvailabilityTask(Main main) {
        this.main = main;
    }

    protected Boolean doInBackground(String... params) {
        Main.Log("doInBackground() isHostAvailable():"+params[0]);

        try {
            return InetAddress.getByName(params[0]).isReachable(30); 
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;       
    }

    protected void onPostExecute(Boolean... result) {
        Main.Log("onPostExecute()");

        if(result[0] == false) {
            main.setContentView(R.layout.splash);
            return;
        }

        main.continueAfterHostCheck();
    }   
}



getActiveNetworkInfo() 를 작동 시키려면 매니페스트에 다음을 추가해야합니다.

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



ConnectivityManager 클래스를 살펴보십시오. 이 클래스를 사용하여 호스트의 활성 연결에 대한 정보를 얻을 수 있습니다. http://developer.android.com/reference/android/net/ConnectivityManager.html

편집 : 당신은 사용할 수 있습니다

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

또는

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 

반환 된 NetworkInfo 객체의 DetailedState 열거 형을 구문 분석합니다.

수정 편집 : 호스트에 액세스 할 수 있는지 여부를 확인하려면 다음을 사용할 수 있습니다.

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .requestRouteToHost(TYPE_WIFI, int hostAddress)

분명히 Context.getSystemService (Context.CONNECTIVITY_SERVICE)를 프록시로 사용하고 있습니다.

ConnectivityManager cm = Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.yourMethodCallHere();



나는이 코드를 만들었고, 그것은 가장 단순하며 부울 뿐이다. if(isOnline()){

연결이 있고 페이지에 상태 코드 200 (안정된 연결)을 연결할 수 있으면 얻을 수 있습니다.

올바른 INTERNETACCESS_NETWORK_STATE 권한을 추가해야합니다.

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}



지금까지 본 모든 것 중에서 가장 짧고 깨끗한 방법은 다음과 같아야합니다.

public final static boolean isConnected( Context context )
{   
   final ConnectivityManager connectivityManager = 
         (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );  
   final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();    
   return networkInfo != null && networkInfo.isConnected();
}

추신 : 이것은 어떤 호스트도 핑하지 않으며, 단지 connectionstatus를 검사합니다. 따라서 라우터에 인터넷 연결이없고 장치가 연결되어 있으면 인터넷이 없더라도이 메서드는 true를 반환 합니다 .
실제 테스트를 위해 HttpHead 요청 (예 : www.google.com)을 실행 하고 상태 확인 권장합니다. 200 개의 OK 항목 모두 정상적으로 작동하고 기기가 인터넷에 연결되어있는 경우입니다.




여기 제가 사용하는 방법입니다 :

public boolean isNetworkAvailable(final Context context) {
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
}

더 좋은 점은 그것이 "연결"되어 있는지 확인하십시오.

public boolean isNetworkAvailable(final Context context) {
    final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}

이 방법을 사용하는 방법은 다음과 같습니다.

if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}

필요한 권한 :

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

https://.com/a/16124915/950427




모든 네트워크 연결을 반복하고 사용할 수있는 연결이 하나 이상 있는지 확인하십시오.

public boolean isConnected() {
    boolean connected = false;

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

    if (cm != null) {
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                    || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    && ni.isConnected() && ni.isAvailable()) {
                connected = true;
            }

        }
    }

    return connected;
}



그것은 나를 위해 일합니다. 그것을 밖으로 시도하십시오.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
        URL url = new URL("http://.com/posts/11642475/edit" );
        //URL url = new URL("http://www.nofoundwebsite.com/" );
        executeReq(url);
        Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show();
    }
    catch(Exception e) {
        Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show();
    }
}

private void executeReq(URL urlObject) throws IOException
{
    HttpURLConnection conn = null;
    conn = (HttpURLConnection) urlObject.openConnection();
    conn.setReadTimeout(30000);//milliseconds
    conn.setConnectTimeout(3500);//milliseconds
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    // Start connect
    conn.connect();
    InputStream response =conn.getInputStream();
    Log.d("Response:", response.toString());
}}



Android 네트워크 / 인터넷 연결 상태를 확인하는 것은 복잡하지 않습니다. 아래 DetectConnection 클래스는이 상태를 확인하는 데 도움이됩니다.

import android.content.Context;
import android.net.ConnectivityManager;

public class DetectConnection {
    public static boolean checkInternetConnection(Context context) {
        ConnectivityManager con_manager = (ConnectivityManager) context
                                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (con_manager.getActiveNetworkInfo() != null
            && con_manager.getActiveNetworkInfo().isAvailable()
            && con_manager.getActiveNetworkInfo().isConnected()) {
                return true;
        } else {
            return false;
        }
    }
}

자세한 내용은 안드로이드 네트워크 / 인터넷 연결 상태를 확인하는 방법을 방문하십시오.




다음은 Utils 클래스의 코드입니다.

public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}



이 방법을 사용하여 네트워크 가용성을 감지 할 수 있습니다.

public static boolean isDeviceOnline(Context context) {
        boolean isConnectionAvail = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isConnectionAvail;
    }



ConnectivityManager를 사용하는 다른 대답은 잘못된 것입니다. 네트워크 연결을한다고해서 인터넷에 접속할 수있는 것은 아니기 때문입니다. 예를 들어 사용자가 커피 숍의 WiFi 포털에 연결되어 있지만 인터넷에 연결할 수는 없습니다. 인터넷에 액세스 할 수 있는지 확인하려면 실제 서버에 연결해야합니다. 일반적으로이 작업을 수행하려는 경우 연결하려는 특정 서버를 염두에두고 있으므로 해당 서버에 연결할 수 있는지 확인하십시오. 다음은 서버에 대한 연결을 확인하는 간단한 방법입니다.

private boolean isOnTheInternet() {
    try {
        URLConnection urlConnection = new URL("http://yourserver").openConnection();
        urlConnection.setConnectTimeout(400);
        urlConnection.connect();
        return true;
    } catch (Exception e) {
        return false;
    }
}

ConnectTimeout을 설정하는 이유는 기본값 인 TCP 시간 초과를 기본값으로 사용하기 때문에 몇 초가 걸릴 수 있기 때문입니다.

안드로이드는 메인 스레드에서 이것을 실행할 수 없게됩니다.







인터넷 연결을 확인하는 다음 클래스를 생성하십시오.

public class ConnectionStatus {

    private Context _context;

    public ConnectionStatus(Context context) {
        this._context = context;
    }

    public boolean isConnectionAvailable() {
        ConnectivityManager connectivity = (ConnectivityManager) _context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
        }
        return false;
    }
}

이 클래스는 단순히 연결 상태의 부울 값을 반환하는 메서드를 포함합니다. 따라서 간단히 말하면, 메서드가 인터넷에 대한 유효한 연결을 찾으면 반환 값이 반환 true되고 그렇지 않으면 false유효한 연결이 없는 경우입니다.

그런 다음 MainActivity의 다음 메소드는 이전에 설명한 메소드의 결과를 호출하고 사용자에게 그에 따라 행동하라는 프롬프트를 표시합니다.

public void addListenerOnWifiButton() {
        Button btnWifi = (Button)findViewById(R.id.btnWifi);

        iia = new ConnectionStatus(getApplicationContext());

        isConnected = iia.isConnectionAvailable();
        if (!isConnected) {
            btnWifi.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
                    Toast.makeText(getBaseContext(), "Please connect to a hotspot",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        else {
            btnWifi.setVisibility(4);
            warning.setText("This app may use your mobile data to update events and get their details.");
        }
    }

위의 코드에서 결과가 false 인 경우 (따라서 인터넷에 연결되어 있지 않으면 사용자는 Android Wi-Fi 패널로 이동하여 Wi-Fi 핫스팟에 연결하라는 메시지가 표시됩니다.




isAvailable() 과 연결되어 isAvailable() 그리고 isConnected() 와의 연결을 설정할 수 있는지를 확인하는 것은 매우 중요합니다.isConnected()

private static ConnectivityManager manager;

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

그리고 당신은 네트워크 활성 WiFi 의 유형을 파멸시킬 수 있습니다 :

public static boolean isConnectedWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

또는 모바일 Móvil :

public static boolean isConnectedMobile(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}

권한을 잊지 마세요.

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



Related