Как определить, что Samsung S10 5G работает в сети 5G? - PullRequest
0 голосов
/ 09 апреля 2019

В Android Q добавлен новый тип сети, NETWORK_TYPE_NR, для 5G, он недоступен для Android Pie.Тем не менее, только что выпущенный Samsung S10 5G полностью поддерживает функцию 5G, он может отображать значок 5G в строке состояния, когда он подключен к сети 5G.

Возможно ли стороннему приложению узнать телефоннаходится в сети 5G для устройства Pie?

Любая помощь приветствуется.

Следующая ссылка - определение для нового типа сети.Он недоступен в ветви Pie для Android.

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Я извлек ServiceState.java из прошивки SM-G977N, и он подтверждает, что они добавили ServiceState.getNrStatus()

5G (NR) активно, если NetworkRegistrationState.NR_STATUS_CONNECTED = 3;

0 голосов
/ 08 июля 2019

Не удалось добавить это в качестве комментария, но, как сказал @Pavel Machala, просмотр ServiceState класса в AOSP дает следующее:

/**
 * 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();
}
0 голосов
/ 03 мая 2019

Я полагаю, что они перенесли код из Q в Pie, поскольку логика для 5G была реализована в конце прошлого года в Q (альфа).Поэтому при использовании 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;

}

...