如何以编程方式使用 android 获取移动网络为 4g+?
How to get mobile network is 4g+ using android programmatically?
我有一个带有 Airtel SIM 卡(印度)的 galaxy phone,它显示我正在通知顶部 window 获得 4G+ 网络。我想以某种方式使用 android 获得相同的“4G+”值。我尝试使用 TelephonyManager 和 ConnectivityManager,但无法找到 returns“4G+”的任何方法。非常感谢任何帮助。
类型不是这样存储的,我们有 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;
}
请检查此答案,因为它详细说明了所有条件场景。
我也一直在四处寻找解决方案。根据我的研究,似乎 4G+/LTE+ 与 4G 没有太大区别,加号图标仅表示它是否使用载波聚合。
因此,某些 vendors/carriers 确实在 Android's code.
中使用名为 hideLtePlus
的特殊标志禁用了他们手机中的此功能
在 Android 11 发布之前,无法在非系统应用程序(或一些反射)上检测到 4G+。
现在您可以使用 TelephonyDisplayInfo.getOverrideNetworkType。如果 returns 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_LOCATION
和 READ_PHONE_STATE
权限。
根据我对运行库存 A10 的 Pixel 4A 的理解,布尔值 config_hideLtePlus
在 A10(我猜是 A11)上不再可用。
但是,我已经能够以一种 hackish 的方式在状态栏中重新添加对 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
编辑 25/8/2021:
我引用相关部分:
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 行。
我有一个带有 Airtel SIM 卡(印度)的 galaxy phone,它显示我正在通知顶部 window 获得 4G+ 网络。我想以某种方式使用 android 获得相同的“4G+”值。我尝试使用 TelephonyManager 和 ConnectivityManager,但无法找到 returns“4G+”的任何方法。非常感谢任何帮助。
类型不是这样存储的,我们有 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;
}
请检查此答案,因为它详细说明了所有条件场景。
我也一直在四处寻找解决方案。根据我的研究,似乎 4G+/LTE+ 与 4G 没有太大区别,加号图标仅表示它是否使用载波聚合。
因此,某些 vendors/carriers 确实在 Android's code.
中使用名为hideLtePlus
的特殊标志禁用了他们手机中的此功能
在 Android 11 发布之前,无法在非系统应用程序(或一些反射)上检测到 4G+。
现在您可以使用 TelephonyDisplayInfo.getOverrideNetworkType。如果 returns 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_LOCATION
和 READ_PHONE_STATE
权限。
根据我对运行库存 A10 的 Pixel 4A 的理解,布尔值 config_hideLtePlus
在 A10(我猜是 A11)上不再可用。
但是,我已经能够以一种 hackish 的方式在状态栏中重新添加对 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
编辑 25/8/2021:
我引用相关部分:
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 行。