Android 5G判断

2 篇文章 0 订阅
1 篇文章 0 订阅

之前需要用到5G网络信息,花了很长时间才去研究怎么判断是否是5G信号,但无论是官方说明的CellInfoNr,CellIdentityNr,CellSignalStrengthNr,最后连一个网络连接callback都用过了,在华为mate30 5G版上拿到的都是LTE(13),真的是心态爆炸。

一次偶然的机会看到ServiceState类,发现它有一个getNrState的方法,查了一下,返回为3的时候就是5G网络,详细代码如下
 

   /**
     * Get the NR 5G state of the mobile data network.
     * @return the NR 5G state.
     * @hide
     */
    public @NRState int getNrState() {
        final NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        if (regInfo == null) return NetworkRegistrationInfo.NR_STATE_NONE;
        return regInfo.getNrState();
    }

是一个隐藏的方法,但还是迫不及待的用反射试了一下
 

private boolean is5GConnected(){
       TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        if(Build.VERSION.SDK_INT >= 26){
            ServiceState serviceState = telephonyManager.getServiceState();
            try{
                Method getNrStateMethod = ServiceState.class.getMethod("getNrState");
                getNrStateMethod.setAccessible(true);
                int result = (int)getNrStateMethod.invoke(serviceState);
                MyLog.i("ALeeObj", "值为:" + result);
                if(result == 3){
                    return true;
                }else{
                    return false;
                }
            }catch (Exception e){
                MyLog.i("ALeeObj", e.toString());
            }
        }
        return false;
    }

结果就是那么忧伤,给我整个这个
 

java.lang.NoSuchMethodException: android.telephony.ServiceState.getNrState []

说实话,当时脾气都有点上来了,直接破罐子破摔,我就看看ServiceState这都整一些什么方法,直接就写了
 

Method []methods = ServiceState.class.getDeclaredMethods();
                for(Method method: methods){
                    MyLog.i("ALeeObj", method.getName());
                }

没错,就是把所有的方法都打印出来,结果给我看到了这玩意

看到这个我真的很激动,不会是华为自己弄得一个吧,赶紧把返回类型和传参类型都打印一下,发现没有传参,返回类型就是一个int,最后试了一下,果然,成了,最终代码如下:

private boolean is5GConnected(){
       TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        if(Build.VERSION.SDK_INT >= 29){
            ServiceState serviceState = telephonyManager.getServiceState();
            try{
                Method hwOwnMethod = ServiceState.class.getMethod("getHwNetworkType");
                hwOwnMethod.setAccessible(true);
                int result = (int)hwOwnMethod.invoke(serviceState);
                MyLog.i("ALeeObj", "值为:" + result);
                if(result == 20){
                    return true;
                }else{
                    return false;
                }
            }catch (Exception e){
                MyLog.i("ALeeObj", e.toString());
            }
        }
        return false;
    }

试了一下,值就是官方NetworkType的值,比如nr就是20,lte就是13等等。
说明一下,这个方法只是华为mate30 5G的有效,其他有没效果,我也不清楚,手上只有这一台测试机,而且我怀疑,自己怀疑啊,是华为手机特有的一个方法,所以什么时候失效也不清楚,大家如果要用,最好做一下心理准备。。。
 

要在Android设备上获取5G GSCN(Global System Communication 5G Nomenclature)信息,您可以按照以下步骤操作: 1. 检查设备支持:确定您的Android设备是否支持5G网络和GSCN。您可以在设备设置中查找关于网络设置或连接类型的信息,或者在设备的规格说明书中查找相关信息。 2. 更新设备软件:确保您的Android设备上安装了最新的操作系统版本。更新操作系统可能包含对5G网络的支持和更好的网络连接体验。 3. 检查网络连接:在设备的快速设置菜单中,查找并打开网络连接设置。选择"移动网络"或"网络类型"选项,并确保选择了5G网络。根据设备的不同,该选项可能标记为"5G"、"5G Auto"或"NR"(New Radio)。 4. 使用网络速度测试工具:在Google Play商店中,搜索并安装可用于测试网络速度的应用程序。启动应用程序,然后执行速度测试。在测试结果中,您应该能够看到您当前连接的网络类型,例如5G,以及相关的GSCN信息,如频段、带宽等。 5. 使用第三方应用程序:一些第三方应用程序可以提供更多有关设备连接的详细信息,包括5G GSCN。例如,您可以尝试使用"Network Signal Info"、"LTE Discovery"或类似的应用程序。这些应用程序将提供有关信号质量、当前连接的网络类型和频段等信息。 请注意,上述步骤仅为一般指导,并可能因设备型号、Android版本和网络供应商而有所不同。如果您仍然无法获取5G GSCN信息,建议您参考设备制造商的说明书或联系设备生产商获取更详细的指导。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值