如何检测Samsung S10 5G在5G网络上运行?
How to detect Samsung S10 5G is running on 5G network?
Android Q 为 5G 添加了新的网络类型,NETWORK_TYPE_NR 即
不适用于 Android 派。近期发布的三星S10全面支持5G。可以在5G网络状态栏显示5G图标
第三方应用程序是否可以知道 Android Pie 设备是否在 5G 网络上?
任何帮助将不胜感激。
下面的link是新网络类型的定义。它在 Android Pie 分支上不可用。
我相信他们将代码从 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;
}
我从 SM-G977N 固件中提取了 ServiceState.java 并确认他们已经添加
ServiceState.getNrStatus()
如果 NetworkRegistrationState.NR_STATUS_CONNECTED = 3;
则 5G(NR) 处于活动状态
无法将此添加为评论,但正如@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();
}
Android11 上有检测 5G 的官方文档。
https://developer.android.com/about/versions/11/features/5g#detection
调用TelephonyManager.listen()
,传入LISTEN_DISPLAY_INFO_CHANGED
,判断用户是否有5G网络连接。
@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)
}
}
}
Link: https://developer.android.com/about/versions/11/features/5g#detection
Android Q 为 5G 添加了新的网络类型,NETWORK_TYPE_NR 即 不适用于 Android 派。近期发布的三星S10全面支持5G。可以在5G网络状态栏显示5G图标
第三方应用程序是否可以知道 Android Pie 设备是否在 5G 网络上?
任何帮助将不胜感激。
下面的link是新网络类型的定义。它在 Android Pie 分支上不可用。
我相信他们将代码从 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;
}
我从 SM-G977N 固件中提取了 ServiceState.java 并确认他们已经添加
ServiceState.getNrStatus()
如果 NetworkRegistrationState.NR_STATUS_CONNECTED = 3;
则 5G(NR) 处于活动状态无法将此添加为评论,但正如@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();
}
Android11 上有检测 5G 的官方文档。 https://developer.android.com/about/versions/11/features/5g#detection
调用TelephonyManager.listen()
,传入LISTEN_DISPLAY_INFO_CHANGED
,判断用户是否有5G网络连接。
@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)
}
}
}
Link: https://developer.android.com/about/versions/11/features/5g#detection