Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidでインターネット接続状態を確認する方法|BroadcastReceiverを使った実装手順を解説

この記事では、BroadcastReceiver(ブロードキャストレシーバー)を使って、Androidアプリでインターネット接続の状態を確認する方法を解説します。Wi-Fiやモバイルデータ通信の接続状況を検知し、結果をトーストメッセージで表示するサンプルアプリを、ステップごとに作成していきましょう。

ステップ1:Android Studioで新規プロジェクトを作成する

まずはAndroid Studioを起動し、「File」→「New Project」から新しいプロジェクトを作成します。必要な項目をすべて入力して、プロジェクトのセットアップを完了させてください。

ステップ2:AndroidManifest.xmlにネットワーク状態の権限を追加する

インターネット接続状態を取得するには、AndroidManifest.xmlファイルにネットワーク状態へのアクセス権限(ACCESS_NETWORK_STATE)を追加する必要があります。以下のように記述しましょう。

<?xml version="1.0" encoding = "utf-8"?>
<manifest xmlns:android = "https://schemas.android.com/apk/res/android"
    package = "com.example.andy.myapplication">
    <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
        <activity android:name = ".MainActivity">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />
                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

ステップ3:MainActivity.javaを実装する

続いて、メインアクティビティとなるMainActivity.javaの内容です。このファイルには、アクティビティの基本的なライフサイクルメソッドが含まれます。

ここではTextViewを作成し、ユーザーがクリックするとbroadcastIntent()メソッドが呼び出され、CONNECTIVITY_ACTIONインテントがブロードキャストされる仕組みになっています。また、onPause()メソッド内でレシーバーの登録解除を行っている点にも注目してください。

import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    private BroadcastReceiver MyReceiver = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyReceiver = new MyReceiver();
        TextView click=findViewById(R.id.click);
        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                broadcastIntent();
            }
        });
    }
    public void broadcastIntent() {
        registerReceiver(MyReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(MyReceiver);
    }
}

ステップ4:NetworkUtilクラスを作成する

ネットワークの接続状態を判定するために、NetworkUtilクラスを作成します。このクラスでは、現在の接続がWi-Fiなのかモバイルデータ通信なのか、あるいはオフラインなのかを判別し、対応するステータス文字列を返します。

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
class NetworkUtil {
    public static String getConnectivityStatusString(Context context) {
        String status = null;
        ConnectivityManager cm = (ConnectivityManager)        context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                status = "Wifi enabled";
                return status;
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                status = "Mobile data enabled";
                return status;
            }
        } else {
        status = "No internet is available";
            return status;
        }
        return status;
    }
}

ステップ5:MyReceiverクラス(BroadcastReceiver)を作成する

次に、ブロードキャストレシーバークラス「MyReceiver.java」を作成します。このレシーバーは、NetworkUtilクラスから取得した接続状態をもとに、UI(トースト表示)を更新する役割を担います。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String status = NetworkUtil.getConnectivityStatusString(context);
        if(status.isEmpty()) {
            status="No Internet Connection";
        }
        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}

ステップ6:マニフェストファイルにレシーバーを登録する

作成したBroadcastReceiverをマニフェストファイルに登録します。以下のように<receiver>要素を追加し、接続変更イベント(CONNECTIVITY_CHANGE)やWi-Fi状態変更イベント(WIFI_STATE_CHANGED)を受け取れるようにしましょう。

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package = "com.example.andy.myapplication">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
    <activity android:name = ".MainActivity>
        <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
        <receiver android:name = "MyReceiver">
            <intent-filter>
                <action android:name = "android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name = "android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

ステップ7:activity_main.xmlでレイアウトを定義する

res/layout/activity_main.xmlファイルには、クリックすることで接続状態のチェックを実行できるTextViewを配置します。

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity">
<TextView
    android:id="@+id/click"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click here"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

アプリを実行して動作を確認する

それでは、アプリを実行してみましょう。実機のAndroid端末をパソコンに接続していることを前提に進めます。Android Studioでプロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。実行デバイスとして自分のモバイル端末を選択すると、端末にアプリの初期画面が表示されます。

Wi-Fi接続中に画面をクリックすると、以下のように接続状態を示すトーストメッセージが表示されます。

Androidでインターネット接続状態を確認する方法|BroadcastReceiverを使った実装手順を解説

Wi-Fiをオフにした場合は、以下のように「No internet is available(利用可能なインターネットがありません)」というメッセージが表示されます。

Androidでインターネット接続状態を確認する方法|BroadcastReceiverを使った実装手順を解説

Androidでインターネット接続状態を確認する方法|BroadcastReceiverを使った実装手順を解説

Androidでインターネット接続状態を確認する方法|BroadcastReceiverを使った実装手順を解説

補足:最新のAndroidバージョンでの注意点

本記事で紹介しているコードは、学習用の古典的な実装例です。CONNECTIVITY_ACTIONNetworkInfoといったAPIは、Android 7.0(API 24)以降で非推奨(deprecated)となっています。近年のAndroidバージョンをターゲットにする場合は、ConnectivityManager.NetworkCallbackを使用してネットワーク状態を監視する方法が公式に推奨されていますので、実際の開発ではこちらの採用も検討してみてください。

  1. Androidでデータ使用量を確認し、通信速度を監視する方法|Check Data Usageの使い方

    Wi-Fiに接続していないとき、モバイルデータはインターネットへのアクセスを可能にしてくれる頼もしい存在です。しかし、高性能なグラフィックを搭載したスマートフォンやデータを大量に消費するアプリを使っていると、知らないうちに通信量が膨らみ、月末に高額な請求を受けてしまうことも少なくありません。この記事では、Androidでデータ使用量を確認し、無駄な出費を防ぐ方法を詳しく解説します。 データ使用量を確認する方法 まず重要なのは、現在のデータ使用量を正確に把握することです。使用量を知らなければ、モバイルデータの消費についてどんな見直しが必要なのか判断できません。最も手軽な方法は、「Check Da

  2. Androidの通信速度を上げる5つの簡単な方法

    学生でもビジネスパーソンでも、インターネットは日常生活に欠かせない存在です。Androidでは3Gや4Gといった高速通信技術を利用できますが、通信速度をさらに向上させられるなら、それに越したことはありません。速度改善を支援するアプリは数多くありますが、実は基本的な最適化だけでも十分な効果が期待できます。 今回は、Androidのインターネット速度を向上させるための、シンプルで基本的な5つのステップをご紹介します。 1. キャッシュを削除する キャッシュメモリがいっぱいになると、Androidの動作が全体的に遅くなり、インターネット速度にも悪影響が及びます。キャッシュは手動で削除することもでき