【问题标题】:How to detect Samsung S10 5G is running on 5G network?如何检测三星 S10 5G 是否在 5G 网络上运行?
【发布时间】:2019-08-31 01:47:19
【问题描述】:

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

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

任何帮助将不胜感激。

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

【问题讨论】:

    标签: android android-networking telephony telecommunication


    【解决方案1】:

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

    【讨论】:

    • 不,它返回 13 (LTE),就像在 Pie 中运行的任何手机一样。
    • 你有这个手机和5G覆盖吗?您可以尝试从 ServiceState 类调用方法 getNrStatus。如果返回3,则应连接5G。
    • ServiceState类中没有getNrStatus这样的方法,Android Q中也没有。代码不会编译。
    • 你需要使用反射。
    • 设法得到一个 SM-G977,上面的示例代码确实有效。这是正确答案!顺便说一句,你如何从固件中提取源代码? @Pavel Machala
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      (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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-25
          • 2020-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多