如何获得移动网络是4g+使用android编程



我有一部带有Airtel SIM卡的galaxy手机(印度(,通知顶部窗口显示我正在使用4G+网络。我想得到同样的";4G+";以某种方式使用android的价值。我尝试了TelephonyManager和ConnectivityManager,但找不到任何返回";4G+";。我们非常感谢您的帮助。

根据我对Pixel 4A运行股票A10的理解,布尔config_hideLtePlus在A10上不再可用(我想,A11(。

然而,我已经能够以一种黑客的方式在状态栏中读取对4G+图标的支持,即编辑systemuigoogle.apk/smali/com/android/systemui/statusbar/policy/MobileSignalController.smali.

更深入,线下

iget-boolean v0, v0, Lcom/android/systemui/statusbar/policy/NetworkControllerImpl$Config;->hideLtePlus:Z

我更换了

if-eqz v0, :cond_4

带有

if-nez v0, :cond_4

YMMV

2021年8月25日编辑:

以下是源代码:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10 release/packages/SystemUI/src/com/android/SystemUI/statusbar/policy/MobileSignalController.java#227

我引用了相关部分:

if (mConfig.show4gForLte) {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G);
if (mConfig.hideLtePlus) {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA,
TelephonyIcons.FOUR_G);
} else {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA,
TelephonyIcons.FOUR_G_PLUS);
}
} else {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE);
if (mConfig.hideLtePlus) {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA,
TelephonyIcons.LTE);
} else {
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA,
TelephonyIcons.LTE_PLUS);
}
}

基本上,我所实现的是触发7-8行的应用,而不是4-5行。

类型不是这样存储的,我们有2g、HSDPA、LTE等标准。

switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion 
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps 
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}

请检查这个答案,因为它详细说明了所有的情况。

https://stackoverflow.com/a/8548926/4491971

我也一直在四处寻找解决方案。根据我的研究,4G+/LTE+似乎与4G没有太大区别,加号图标只指示它是否使用载波聚合。

因此,一些供应商/运营商确实在他们的手机中禁用了这一功能,并在安卓代码中使用了一个名为hideLtePlus的特殊标志。

在安卓11发布之前,没有办法在非系统应用程序上检测到4G+(或有一些反射(。现在您可以使用TelephonyDisplayInfo.getOverrideNetworkType。如果它返回TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,则表示您使用的是4G+/LTE+。

你也可以这样做(API 26+(:

TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
ServiceState serviceState = telephony.getServiceState();
String serviceStateString = serviceState.toString();
if (serviceStateString.matches("[mI|i]sUsingCarrierAggregation ?= ?true"))
{
// You're on 4G+.
}
}
else
{
// There's no standard way to detect 4G+ exposed by Android API
}

请注意,您需要同时拥有ACCESS_COARSE_LOCATIONREAD_PHONE_STATE权限。

最新更新