15

Android は次の状態の違いをどのように正確に判断しますか?

  1. ネットワーク インターフェース (Wifi や 3G など) はアクティブですが、インターネットにアクセスできません。

  2. ネットワーク インターフェイスがアクティブであり、Web ページでネットワークにサインインするようにユーザーに要求する必要があります。

  3. ネットワーク インターフェイスがアクティブで、インターネットにアクセスできる。

単純な HTTP リクエストを固定 URL (おそらく google.com でしょうか?) に送信し、返されたドキュメントが期待どおりであることを確認しますか? もしそうなら、私たちは使用された URL を知っていますか?

4

3 に答える 3

0

更新:回避するためにコードを更新しましたNetworkOnMainThreadException

現在、次の方法を使用して、デバイスがインターネットにアクセスできるかどうかを判断しています。

public class NetworkConnectivityHelper {
    public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){

        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean isDeviceConnectedToInternet = false;
                NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

                if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){
                    try {
                        InetAddress.getByName("google.com").isReachable(2);
                        isDeviceConnectedToInternet = true;
                    } catch (UnknownHostException e){
                        isDeviceConnectedToInternet = false;
                    } catch (IOException e){
                        isDeviceConnectedToInternet = false;
                    }
                }

                final boolean result = isDeviceConnectedToInternet;
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        callback.done(result);
                    }
                });

            }
        }).start();

    }


    public static abstract class ResultCallback{
        public abstract void done(boolean connected);
    }
}

これを次のように呼び出します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ....
    //Populate
    NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper();
    networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() {
        @Override
        public void done(boolean connected) {
            if (connected) {
                //Yey, the device is connected. 
                //Now, do some work
            }else{
                //The device is disconnected
            }
        }
    });
    ....

}

お役に立てれば!

于 2012-11-20T23:26:53.073 に答える
-1

これを試して:

public static boolean isNetworkAvailable(Context context)
{
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();

    return (info != null);
}
于 2012-11-15T19:58:58.930 に答える
-1

はい、ping を送信することもできます :)

小さなネットワーク ユーティリティ クラスで使用する必要がある順序の操作は次のとおりです。

于 2012-11-15T19:52:24.903 に答える