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

【Android】ネットワークタイプ(2G・3G・4G)を判定する方法を解説

この記事では、Androidアプリで現在のモバイルネットワーク接続が2G、3G、4Gのどれに該当するかを判定する方法を解説します。TelephonyManagerクラスのgetNetworkType()メソッドを使えば、端末が接続している通信方式(GPRS、EDGE、UMTS、HSDPA、LTEなど)を取得し、世代ごとに分類することができます。

開発手順

ステップ1:新規プロジェクトの作成

Android Studioを起動し、「File」→「New Project」から新しいプロジェクトを作成します。必要な項目をすべて入力して、プロジェクトの雛形を生成してください。

ステップ2:レイアウトファイル(activity_main.xml)の編集

res/layout/activity_main.xml に以下のコードを追加します。ここでは、判定結果を表示するためのTextViewを画面中央に配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="ネットワークタイプ(2G / 3G / 4G)を判定します"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

ステップ3:MainActivity.java の実装

src/MainActivity.java に以下のコードを追加します。getNetworkClass()メソッド内でネットワークタイプを取得し、switch文で2G・3G・4Gに分類した結果をToastで表示します。

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.Toast;
import java.util.Objects;

public class MainActivity extends AppCompatActivity {

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

    public void getNetworkClass(Context context) {
        TelephonyManager mTelephonyManager = (TelephonyManager)
                context.getSystemService(Context.TELEPHONY_SERVICE);
        int networkType = Objects.requireNonNull(mTelephonyManager).getNetworkType();

        switch (networkType) {
            // 2G系のネットワークタイプ
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                Toast.makeText(getApplicationContext(), "接続中のネットワークは 2G です", Toast.LENGTH_SHORT).show();
                break;

            // 3G系のネットワークタイプ
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                Toast.makeText(getApplicationContext(), "接続中のネットワークは 3G です", Toast.LENGTH_SHORT).show();
                break;

            // 4G系のネットワークタイプ
            case TelephonyManager.NETWORK_TYPE_LTE:
                Toast.makeText(getApplicationContext(), "接続中のネットワークは 4G です", Toast.LENGTH_SHORT).show();
                break;

            default:
                break;
        }
    }
}

ステップ4: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="app.com.sample">

    <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>

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

</manifest>

アプリの実行と動作確認

それでは、アプリを実行してみましょう。実際のAndroidデバイスをパソコンに接続していることを前提としています。Android Studioからアプリを実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーの実行(Run)アイコンをクリックします。表示された候補から接続済みのモバイルデバイスを選択すると、デバイス上でアプリが起動し、接続中のネットワークタイプがToastメッセージとして表示されます。

コードのポイント

  • NETWORK_TYPE_GPRS / EDGE / CDMA / 1xRTT / IDEN → 2G回線に分類されます。
  • NETWORK_TYPE_UMTS / HSDPA / HSUPA / HSPA / HSPAP / EVDO系 / EHRPD → 3G回線に分類されます。
  • NETWORK_TYPE_LTE → 4G回線に分類されます。
  • switch文では各ケースに必ずbreakを記述し、意図しないフォールスルー(後続ケースの連続実行)を防いでいます。

補足:APIレベル30(Android 11)以降ではgetNetworkType()は非推奨となっており、代わりにgetDataNetworkType()getVoiceNetworkType()の使用が推奨されています。これらのメソッドを利用する場合はREAD_PHONE_STATE権限が必要になる点に注意してください。また、5G対応端末ではNETWORK_TYPE_NRを判定条件に追加することで、5G接続にも対応できます。

  1. Androidでネットワーク設定をリセットする方法|Wi-Fi・モバイルデータの不調を解消

    Androidスマートフォンでインターネットの速度が遅くなって困っていませんか?Wi-Fiやモバイルデータ通信での接続にトラブルが発生している方も多いのではないでしょうか。原因が何であれ、スマートフォンのネットワーク設定をリセットすることが、こうした問題を解決する最善策になる場合があります。 この記事では、Androidデバイスでネットワーク設定をリセットする具体的な手順を解説するとともに、リセットを実行したときに実際に何が起こるのかについても詳しく紹介します。 Androidでネットワーク設定をリセットする方法 ネットワーク設定のリセットは、モバイルデータ通信の速度低下を改善したり、Wi-F

  2. PCでNATタイプを変更する方法|UPnP・ポート開放・VPNなど7つの対処法を解説

    NAT(ネットワークアドレス変換)とは ネットワークアドレス変換(NAT)とは、あるIPアドレスを別のIPアドレスにマッピングし直す技術のことです。ネットワークパケットがルーティング機器を通過する際に、IPヘッダー内の情報が書き換えられます。 NATはパケットレベルでIPアドレス情報を変更するため、アドレッシングの状況やネットワークトラフィックへの影響によって、その動作は実装ごとに異なります。また、NAT機器メーカーがその仕様を公開しないケースも多くあります。 NATの目的 NATには主に次のような目的があります。 セキュリティの強化:プライベートIPアドレスをインターネットから隠すことで