Проверка, есть ли у программы интернет через wifi - PullRequest
0 голосов
/ 29 мая 2011

После прочтения некоторых ответов и попыток их использования я все еще не могу заставить свой код вернуть правильное состояние, если есть интернет по Wi-Fi или нет.

Я должен "пинговать" по WIFI, потому что мы можем подключиться к точке доступа без дальнейшего подключения к Интернету. Вот полный код.

ConnectivityManager CM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NI = CM.getActiveNetworkInfo();
boolean IC = false;             
IC = CM.requestRouteToHost(ConnectivityManager.TYPE_WIFI, FlavaGr.lookupHost(pingyIp));
System.out.println("##### IC=" + IC + "  TYPE = " + NI.getTypeName());

здесь lookupHost, предложенный другим пользователем:

public static int lookupHost(String hostname) {
InetAddress inetAddress;
try {
    inetAddress = InetAddress.getByName(hostname);
} catch (UnknownHostException e) {
    return -1;
}
byte[] addrBytes;
int addr;
addrBytes = inetAddress.getAddress();
addr = ((addrBytes[3] & 0xff) << 24)
        | ((addrBytes[2] & 0xff) << 16)
        | ((addrBytes[1] & 0xff) << 8)
        |  (addrBytes[0] & 0xff);
return addr;
}   

IC всегда ложна. Я чувствую, что ответ за один шаг, но все еще не знаю, что делать.

PS Извините за мой английский.

Ответы [ 4 ]

1 голос
/ 25 апреля 2013

У меня все получилось:)

Во-первых, это не разрешено, и нехорошо делать httprequest в главном потоке!Так что вы должны сделать это в AsyncTask!

Во-вторых, вам не нужно проверять, есть ли соединение или нет ... потому что вы можете быть подключены к локальному соединению или слишком медленное соединение!

Все, что вам нужно, это сделать http-запрос и проверить, есть ли ответ в точное время.Для этого вам нужно установить тайм-аут!Но только тайм-аут не работает - вам нужно проверить код состояния ... вот он:

class ConnectionTask extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread set flag to false
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        flag = false;
    }

    boolean flag;

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        Log.v("url",url);
        JSONObject json = jParser.makeHttpRequest(url, "GET", params); 
        /*is json equal to null ?*/
        if( json != null )
        {
            // Check your log cat for JSON response
            Log.d("json: ", json.toString());
            try {
                message = json.getString("message");
                flag = true;//we succeded so we make the flag to true
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else
        {//if json is null
            message = "not connected to internet connection";
            flag = false;
        }

        return null;
    }

    /**
     * After completing background task check if there is connection or no
     * **/
    protected void onPostExecute(String file_url) {
        // updating UI from Background Thread
        if(flag)
        {//flag is tro so there is connection
            Log.v("connection", "conectioOOOOOoooOooooOoooooOOOOoooOOOOOO");
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into textview
                     * */
                    TextView tvTest = (TextView) findViewById(R.id.testTextView);
                    tvTest.setText(message);
                }
            });
        }
        else
        {////we catched that there is no connection!
            Log.v("connection", "nooooooo conectioOOOOOoooOooooOoooooOOOOoooOOOOOO");
            runOnUiThread(new Runnable() {
                public void run() {
                            /*update ui thread*/
                    TextView tvTest = (TextView) findViewById(R.id.testTextView);
                    tvTest.setText("no connection");
                    Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_LONG).show();
                }
            });
        }
    }

}

, так что теперь парсер json:)

public class JSONParser {

private InputStream is = null;
private JSONObject jObj = null;
private String json = "";
static int timeoutConnection = 10000;
static int timeoutSocket = 10000;

// constructor
public JSONParser() {

}

// function get json from url
// by making HTTP POST or GET method
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // check for request method
    if(method == "POST"){
        try{
           HttpPost request = new HttpPost(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. 
           HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
           // Set the default socket timeout (SO_TIMEOUT) 
           // in milliseconds which is the timeout for waiting for data.
           HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
           // create object of DefaultHttpClient    
           DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
           request.addHeader("Content-Type", "application/json");
           HttpResponse response = httpClient.execute(request);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
               is = entity.getContent();

            }
           // convert entity response to string

       }
     catch (SocketException e)
      {
          e.printStackTrace();
         return null;
      }
     catch (Exception e)
      {
          e.printStackTrace();
         return null;
      }

    }else if(method == "GET"){
        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. 
           HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
           // Set the default socket timeout (SO_TIMEOUT) 
           // in milliseconds which is the timeout for waiting for data.
           HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
           // create object of DefaultHttpClient    
           DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
           request.addHeader("Content-Type", "application/json");
           HttpResponse response = httpClient.execute(request);
           StatusLine statusLine = response.getStatusLine();
           int statusCode = statusLine.getStatusCode();
           if (statusCode == 200) {
               HttpEntity entity = response.getEntity();
               is = entity.getContent();

           }
           // convert entity response to string

           }
         catch (SocketException e)
          {
             e.printStackTrace();
             return null;
          }
         catch (Exception e)
          {
             e.printStackTrace();
             return null;
          }
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

Работает отлично!

1 голос
/ 30 мая 2011

Мой ответ:

    ConnectivityManager CM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo NI = CM.getActiveNetworkInfo();
    if (NI!=null) {
        if (NI.isAvailable()) { 
            boolean IC = false;
            if (NI.getTypeName()=="WIFI") {
                int response = 0;
                try {
                    URL url = new URL("http://www.google.com/");    
                    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                    response = in.read();
                    in.close();

                    IC = (response != -1) ? true : false;
                    System.out.println("##### IC=" + IC + "  TYPE = " + NI.getTypeName() + "  response = " + response);
                    if (true){
                                                ;
                    };
                } catch (Exception e) {
                }}}}}

Просто чтобы проверить, является ли текущее соединение WIFI, а затем запросить страницу, проверяя первый символ.

1 голос
/ 29 мая 2011

Это код, который я использую, и он работает без проблем:

    ConnectivityManager conn;
            conn=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            // Skip if no connection, or background data disabled
            NetworkInfo info = conn.getActiveNetworkInfo();
            if (info == null ||
            !conn.getBackgroundDataSetting()) {
                // No Network detected
                return;
            } else {
                int netType = info.getType();
                int netSubtype = info.getSubtype();
                if (netType == ConnectivityManager.TYPE_WIFI) {
                    //WIFI DETECTED
                              } else if (netType == ConnectivityManager.TYPE_MOBILE
                && netSubtype >2) {
                           //Mobile connected that is at least 3G   
                } else {
                    //Has connection but i'm not sure what kind
                }
            }

и следующее в моем манифесте:

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

Обратите внимание, что при эмуляции обнаруженное интернет-соединение может вести себя странно.

0 голосов
/ 29 мая 2011

попробуйте этот метод, чтобы проверить, есть ли подключение к Интернету или нет:

public boolean connexionStatus(ConnectivityManager connec)
    {
        NetworkInfo[] allNetwork = connec.getAllNetworkInfo();
        if (allNetwork != null) 
        {
            for (int i = 0; i < allNetwork.length; i++) 
            {
                if (allNetwork[i].getState() == NetworkInfo.State.CONNECTED || 
                        allNetwork[i].getState() == NetworkInfo.State.CONNECTING )
                    return true;
            }
        }
        return false;
    }

ПРИМЕЧАНИЕ: у вас должно быть разрешение ИНТЕРНЕТ в вашем манифест

...