Android Q为5G添加了新的网络类型NETWORK_TYPE_NR,但不适用于Android Pie。但是刚刚发布的三星S10 5G完全支持5G功能,当它在5G网络上时,它可以在状态栏中显示5G图标。
第三方应用程序是否可能知道手机在Pie设备的5G网络上?
任何帮助将不胜感激。
以下链接是新网络类型的定义。它在Android Pie分支上不可用。
答案 0 :(得分:1)
有一个官方文档可以在Android 11上检测5G。 https://developer.android.com/about/versions/11/features/5g#detection
致电TelephonyManager.listen()
,传入LISTEN_DISPLAY_INFO_CHANGED
,以确定用户是否具有5G网络连接。
答案 1 :(得分:0)
我相信他们将代码从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;
}
答案 2 :(得分:0)
我从SM-G977N固件中提取了 ServiceState.java ,它确认它们已添加
ServiceState.getNrStatus()
如果NetworkRegistrationState.NR_STATUS_CONNECTED = 3,则5G(NR)处于活动状态; </ p>
答案 3 :(得分:0)
无法添加此评论,但正如@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();
}
答案 4 :(得分:0)
如@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)
}
}
}
链接:https://developer.android.com/about/versions/11/features/5g#detection