如何检测Samsung S10 5G在5G网络上运行?

How to detect Samsung S10 5G is running on 5G network?

Android Q 为 5G 添加了新的网络类型,NETWORK_TYPE_NR 即 不适用于 Android 派。近期发布的三星S10全面支持5G。可以在5G网络状态栏显示5G图标

第三方应用程序是否可以知道 Android Pie 设备是否在 5G 网络上?

任何帮助将不胜感激。

下面的link是新网络类型的定义。它在 Android Pie 分支上不可用。

我相信他们将代码从 Q 反向移植到 Pie,因为 5G 的逻辑是在去年年底在 Q(alpha)中实现的。 所以在使用的时候 TelephonyManager.getNetworkType()

你可能会得到

20 (5G)

编辑

根据下面的评论:网络类型将是 13 所以它不能解决问题。

编辑

尝试使用反射

static boolean isNRConnected(TelephonyManager telephonyManager) {
    try {
        Object obj = Class.forName(telephonyManager.getClass().getName())
                .getDeclaredMethod("getServiceState", new Class[0]).invoke(telephonyManager, new Object[0]);

        Method[] methods = Class.forName(obj.getClass().getName()).getDeclaredMethods();

        for (Method method : methods) {
            if (method.getName().equals("getNrStatus") || method.getName().equals("getNrState")) {
                method.setAccessible(true);
                return ((Integer) method.invoke(obj, new Object[0])).intValue() == 3;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

我从 SM-G977N 固件中提取了 ServiceState.java 并确认他们已经添加 ServiceState.getNrStatus()

如果 NetworkRegistrationState.NR_STATUS_CONNECTED = 3;

则 5G(NR) 处于活动状态

无法将此添加为评论,但正如@Pavel Machala 所说,查看 AOSP 中的 ServiceState class 会产生以下内容:

/**
 * Get the NR 5G status of the mobile data network.
 * @return the NR 5G status.
 * @hide
 */
public @NRStatus int getNrStatus() {
    final NetworkRegistrationState regState = getNetworkRegistrationState(
            NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
    if (regState == null) return NetworkRegistrationState.NR_STATUS_NONE;
    return regState.getNrStatus();
}

Android11 上有检测 5G 的官方文档。 https://developer.android.com/about/versions/11/features/5g#detection

调用TelephonyManager.listen(),传入LISTEN_DISPLAY_INFO_CHANGED,判断用户是否有5G网络连接。

@Hunter 建议您需要使用电话管理器的“监听”,但如果它是 api 30+,您需要授予 READ_PHONE 权限并监听 LISTEN_DISPLAY_INFO_CHANGED 并覆盖onDisplayInfoChanged 来自 PhoneStateListener

(context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).listen(customPhoneStateListener,PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)

监听器应该是这样的:

private  class CustomPhoneStateListener : PhoneStateListener() {
    override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {
               
                super.onDisplayInfoChanged(telephonyDisplayInfo)
              
                    when (telephonyDisplayInfo.overrideNetworkType) {
                         //5G
                        OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO,
                        OVERRIDE_NETWORK_TYPE_NR_NSA,
                        OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> setNetworkChange(NETWORK_TYPE_NR)
                        OVERRIDE_NETWORK_TYPE_LTE_CA -> {
                            setNetworkChange(19) //LTE+
                        }
                        else -> setNetworkChange(telephonyDisplayInfo.networkType)
                    }
                } else {
                    setNetworkChange(telephonyDisplayInfo.networkType)
                }
            }

   }

Link: https://developer.android.com/about/versions/11/features/5g#detection