Проверка подключения к интернету

| 02.12.2014

Нередко в приложении перед началом запуска каких-либо задач по скачиванию данных с внешнего ресурса приходится проверять, есть ли подключение к интернету. В этом уроке мы создадим небольшое приложение для демонстрации, как это можно сделать. При этом мы будем проверять две «вещи»:

- собственно, наличие подключения к сети
- доступность внешних ресурсов (будем делать тестовый запрос к google)

Проверка подключения к интернету

Обратите внимание, что тестовый запрос нельзя выполнить в том же «main» потоке, поэтому данный код мы вынесем в отдельный поток. Также вы можете использовать для этого AsyncTask.

Приложение будет включать только один экран с кнопкой, по нажатию на которую будем запускать проверку.

Код layout-a: res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Check Internet"
        android:onClick="check"/>

</LinearLayout>

Здесь к кнопке мы добавили атрибут android:onClick, который запустит метод check().

Java-код — MainActivity.java

package ru.androiddocs.internet;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void check(View v) {
        // запускаем проверку в новом потоке
        new Thread(new Runnable() {
            @Override
            public void run(){
                if (checkInternet()) {
                    Log.d("my_tag", "Есть подключение");
                } else {
                    Log.d("my_tag", "Нет подключения");
                }
            }
        }).start();
    }

    // главный метод для проверки подключения
    public boolean checkInternet() {

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

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        // проверка подключения
        if (activeNetwork != null && activeNetwork.isConnected()) {
            try {
                // тест доступности внешнего ресурса
                URL url = new URL("http://www.google.com/");
                HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
                urlc.setRequestProperty("User-Agent", "test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1000); // Timeout в секундах
                urlc.connect();
                // статус ресурса OK
                if (urlc.getResponseCode() == 200) {
                    return true;
                }
                // иначе проверка провалилась
                return false;

            } catch (IOException e) {
                Log.d("my_tag", "Ошибка проверки подключения к интернету", e);
                return false;
            }
        }

        return false;
    }
}

В файл манифеста добавляем нужные разрешения:

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

Весь код:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.androiddocs.internet" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

Запускаем приложение, жмем кнопку, экспериментируем с подключением. В логах смотрим результат:

Проверка подключения к интернету

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*