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

时间:2019-04-09 17:38:42

标签: android android-networking telephony telecommunication

Android Q为5G添加了新的网络类型NETWORK_TYPE_NR,但不适用于Android Pie。但是刚刚发布的三星S10 5G完全支持5G功能,当它在5G网络上时,它可以在状态栏中显示5G图标。

第三方应用程序是否可能知道手机在Pie设备的5G网络上?

任何帮助将不胜感激。

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

5 个答案:

答案 0 :(得分:1)

有一个官方文档可以在Android 11上检测5G。 https://developer.android.com/about/versions/11/features/5g#detection

致电TelephonyManager.listen(),传入LISTEN_DISPLAY_INFO_CHANGED,以确定用户是否具有5G网络连接。

答案 1 :(得分:0)

我相信他们将代码从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;

}

答案 2 :(得分:0)

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

如果NetworkRegistrationState.NR_STATUS_CONNECTED = 3,则5G(NR)处于活动状态; <​​/ p>

答案 3 :(得分:0)

无法添加此评论,但正如@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();
}

答案 4 :(得分:0)

如@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)
                }
            }

   }

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