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 機能を追加する | 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テスト | Android オープンソース プロジェクト
どうやら NR_SA (5G スタンドアロン) は、2つのクラスから取得できる3つの値の組み合わせで判定できるようです。
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エリアへ。
[設定]
|
[デバイス情報]
|
[SIMのステータス]
私は、5Gは、
「NR_NSA (5G非スタンドアロン)」
しか掴んだことがありません!
「NR_SA (5Gスタンドアロン)」は
どこに行けばつかめるのでしょうか、
いや、今は待つしかないのでしょうか?
Pixel5 で ahamo を使いながら書くページ
Pixel5 / Pixel4a (5G) で「ミリ波」は使えたのか。【ahamo】
なぜ ahamo は 5Gエリアで4G通信に切り替わるのか。
ドコモ 5G 通信速度 どれぐらい?
Test 5G - Google Play のアプリ
「0001docomo」は 誰でも 無料 で 自動接続 できますので設定方法を