5G を検出して接続タイプを特定する 【NR NSA/SA/MMWAVE】

Androidで、どの5Gが掴めているか確認します。

 

条件

1. Android11 (OS)
2. 5G対応デバイス (端末)
3. SIMカード (通信)

手元にある Pixel5 (Android11) + docomo ahamo SIM で挑みます。

 

5G を検出する

TelephonyManager.listen() を呼び出して LISTEN_DISPLAY_INFO_CHANGED を渡し、ユーザーが 5G ネットワークに接続しているかどうか判断します。onDisplayInfoChanged() メソッドをオーバーライドして、アプリが接続されているネットワークの種類を判断します。

LISTEN_DISPLAY_INFO_CHANGEDからPhoneStateListenerイベントをPhoneStateListenerし、 onDisplayInfoChanged()メソッドをオーバーライドすることにより、5G検出をサポートします。

5G検出

👉 アプリに 5G 機能を追加する  |  Android デベロッパー 

ここらは、callbackFlow を使うと掴んでいるネットワークの種類が変化するたびにUIを変化させることができますね!

// 5G を検出して接続タイプを特定する 【NR NSA/SA/MMWAVE】
// https://android.benigumo.com/20210407/5g/
@ExperimentalCoroutinesApi
internal suspend inline fun TelephonyManager.fiveGInfo() = callbackFlow<Type> {
val callback = object : PhoneStateListener() {
override fun onDisplayInfoChanged(info: TelephonyDisplayInfo) {
try {
super.onDisplayInfoChanged(info)
val type = Type(dataNetworkType, info.networkType, info.overrideNetworkType)
offer(type)
} catch (e: SecurityException) {
Log.e("", "Permission not required.", e)
}
}
}
listen(callback, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
awaitClose {
listen(callback, PhoneStateListener.LISTEN_NONE)
}
}
/*
lifecycleScope.launch {
getSystemService<TelephonyManager>()!!.fiveGInfo().collect { type ->
updateView(type.toString)
}
}
*/

ここで気になっていたのが、すでに一部キャリアから公開が始まってる NR_SA (5G スタンドアロン) の戻り値が掲載されてないことでした。

ちなみに、USモデルでは以下のような記事で、直近のパッチで対応など書かれてる。

👉 Pixel 5 and 4a 5G don't support 5G SA right now, but they will next year 
👉 Pixel 5, 4a 5G adds Standalone (SA) on T-Mobile, Google Fi - 9to5Google 

 

接続タイプを特定する

次の値を使用して、5GのNSA(非スタンドアロン)、mmWave(ミリ波)、およびSA(スタンドアロン)接続タイプを区別します。

5GのNSA(非スタンドアロン)、mmWave(ミリ波)、およびSA(スタンドアロン)接続タイプを区別します

👉 5Gテスト  |  Android オープンソース プロジェクト 

どうやら NR_SA (5G スタンドアロン) は、2つのクラスから取得できる3つの値の組み合わせで判定できるようです。

NR NSA/SA/MMWAVE


import android.telephony.TelephonyDisplayInfo.*
import android.telephony.TelephonyManager.*
// 5G を検出して接続タイプを特定する 【NR NSA/SA/MMWAVE】
// https://android.benigumo.com/20210407/5g/
fun fiveGTypeName(dataNetwork: Int, network: Int, overrideNetwork: Int) = when {
dataNetwork == NETWORK_TYPE_LTE
&& network == NETWORK_TYPE_LTE
&& overrideNetwork == OVERRIDE_NETWORK_TYPE_NR_NSA -> "5G_NSA"
overrideNetwork == OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> "5G_MMWAVE"
dataNetwork == NETWORK_TYPE_NR
&& network == NETWORK_TYPE_NR -> "5G_SA"
else -> "NOT 5G" // not 5G
}

 

結果

確認しやすいように基準となる値の3つを並べて表示するようにしておいて、いざ5Gエリアへ。

ahamo 5G NR_NSA NR_SA
👉 Test 5G - Google Play のアプリ 


[設定]

  |

[デバイス情報]

  |

[SIMのステータス]

5G NR_NSA
私は、5Gは、

「NR_NSA (5G非スタンドアロン)」

しか掴んだことがありません!

「NR_SA (5Gスタンドアロン)」は

どこに行けばつかめるのでしょうか、

いや、今は待つしかないのでしょうか?

👉 Pixel5 で ahamo を使いながら書くページ 
👉 Pixel5 / Pixel4a (5G) で「ミリ波」は使えたのか。【ahamo】 
👉 なぜ ahamo は 5Gエリアで4G通信に切り替わるのか。 
👉 ドコモ 5G 通信速度 どれぐらい? 
👉 Test 5G - Google Play のアプリ 

👉 「0001docomo」は 誰でも 無料 で 自動接続 できますので設定方法を hatena-bookmark


関連ワード:  docomoGoogleツール評判速報開発