3

私のアプリケーションでは、デバイスがインターネットに接続されているかどうかを確認する必要があります。ConnectivityManager を使用してみましたが、100% 正確な結果が得られません。たとえば、Wi-Fi 接続はあるが、インターネット リソースにアクセスできない場合があります。私の場合、インターネットに実際にアクセスするには、Wi-Fi 経由で接続した後、VPN 接続を開く必要があります。したがって、ConnectivityManager を使用したアプローチは機能しません。

それで、上記に関して - 確実にするために手動のhttpリクエストを書くべきですか、それとも別の方法がありますか?

ここに私が使用しているコードがあります

ConnectivityManager cm =  (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected() && cm.getActiveNetworkInfo().isAvailable();
4

5 に答える 5

3

はい、あなたは正しいです。インターネットにアクセスできることを確認するには、明示的にテストする必要があります。HTTP アクセスが必要な場合は、後で接続したいホストに接続してみてください。

ただし、後で使用する予定の接続方法を使用する必要があります。HTTP は機能しますが、FTP は機能しません。したがって、FTP アクセスが必要な場合は、テストする必要があります。


外部 IP も取得したい場合は、次の方法を使用できます。

public static InetAddress getExternalIp() throws IOException {
    URL url = new URL("http://automation.whatismyip.com/n09230945.asp");
    URLConnection connection = url.openConnection();
    connection.addRequestProperty("Protocol", "Http/1.1");
    connection.addRequestProperty("Connection", "keep-alive");
    connection.addRequestProperty("Keep-Alive", "1000");
    connection.addRequestProperty("User-Agent", "Web-Agent");

    Scanner s = new Scanner(connection.getInputStream());
    try {
        return InetAddress.getByName(s.nextLine());
    } finally {
        s.close();
    }
}

この方法で IP アドレスを正常に取得できた場合は、HTTP 経由で接続できます。

于 2012-06-19T08:18:13.487 に答える
2

インターネット接続を毎回チェックするのではなく、ConnectionTimeoutHTTPRequest に設定するのが最善の方法だと思います。

try
  {

   HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   // Set the timeout in milliseconds until a connection is established.
   // The default value is zero, that means the timeout is not used. 
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   // Set the default socket timeout (SO_TIMEOUT) 
   // in milliseconds which is the timeout for waiting for data.
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
   // create object of DefaultHttpClient    
   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);
   // get response entity
   HttpEntity entity = response.getEntity();
   // convert entity response to string

     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "-222" + e.toString();
  }
 catch (Exception e)
  {
     return "-333" + e.toString();
  }
于 2012-06-19T08:26:43.680 に答える
0

これを試して

private void MyCheckinternet() {
        // TODO Auto-generated method stub
        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
                    connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
                //we are connected to a network
                connected = true;
            }
            else
            {
                connected = false;
    }
}
于 2012-09-18T13:33:58.237 に答える
0

これを試して、

     private boolean checkInternetConnection() {
     try {

            ConnectivityManager nInfo = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            nInfo.getActiveNetworkInfo().isConnectedOrConnecting(); 

            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
                return true;
            } else { 
                return false; }

        } catch (Exception e) {
            return false;
        }
    }

それは私にとって完璧に機能しています...

それが役に立てば幸い

于 2012-06-19T08:24:32.940 に答える
0

これで試して、

NetworkInfo ActiveNetwork;
String Isconnected="";
ConnectivityManager connectivitymanager;
connectivitymanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Connection con=new Connection();
try
{           
    ActiveNetwork=connectivitymanager.getActiveNetworkInfo();
    Isconnected="true";                 
}
catch(Exception error)
{
    IsConnected="false";
}
于 2012-06-19T08:25:42.333 に答える