Android проверка подключения при низком заряде батареи (режим энергосбережения) - PullRequest
0 голосов
/ 23 марта 2020

Я попробовал приведенный ниже код для проверки возможности подключения:

public static NetworkInfo getNetworkInfo(Context context) {
    if (context == null)
        return null;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null)
        return null;
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected())
        return activeNetwork;
    else {
        for (Network n: cm.getAllNetworks()) {
            NetworkInfo nInfo = cm.getNetworkInfo(n);
            if(nInfo != null && nInfo.isConnected())
                return nInfo;
        }
    }
    return activeNetwork;
}

public static boolean isConnectivityAllowed(Context context) {
    NetworkInfo info = NetworkUtils.getNetworkInfo(context);
    return info != null && info.isConnected();
}

Как правило, он работает нормально, но в некоторых случаях он возвращается отключенным, хотя у меня есть соединение. После поиска, тестирования, проверки журналов я понял, что при низком заряде батареи устройства, если я запускаю приложение, функция возвращается отключенной, потому что ОС переводит систему в режим энергосбережения, а затем, если я изменяю подключение, приложение получает правильный ответ. , Более подробная информация доступна здесь в ответе @phil.

Кто-нибудь знает, как проверить соединение при включенном энергосбережении?!

1 Ответ

0 голосов
/ 24 марта 2020

Добавьте следующие разрешения в AndroidManifest. xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Создайте класс NetworkUtils для проверки подключения

public class NetworkUtils {

/**
 * Check if mobile data is enabled
 *
 * @return mobile data on or off
 */
private static boolean isMobileDataEnabled(Context context) {
    Context ctx = context.getApplicationContext();
    ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        return (Boolean) cm.getClass().getMethod("getMobileDataEnabled").invoke(cm, new Object[0]);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    return false;
}

/**
 * Check if connected to wifi network
 *
 * @return wifi connected or not
 */
private static boolean isWifiConnected(Context context) {
    WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    return wm != null && wm.isWifiEnabled() && wm.getConnectionInfo().getNetworkId() != -1;
}

/**
 * Check if mobile data is on or device is connected to wifi network
 */
public static boolean isConnected(Context context) {
    return isMobileDataEnabled(context) || isWifiConnected(context);
}}

Вызовите NetworkUtils.isConnected () для использования

public class MainActivity extends AppCompatActivity {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Check connectivity
    boolean isConnected = NetworkUtils.isConnected(this);
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...