Как узнать программно, включена ли MobileData на Android P?

Есть ли способ программно проверить, включен ли MobileData на Android P?

Перед P мы можем использовать getMobileDataEnabled() с отражением, как этот ответ. https://stackoverflow.com/a/12864897/3752013

Но после P методы отражения вызывают исключение... https://developer.android.com/about/versions/pie/restrictions-non-sdk-interfaces#results-of-keeping-non-sdk

Есть идеи?


person user3752013    schedule 15.11.2018    source источник


Ответы (3)


Используйте следующий класс

public class NetworkEventReceiver extends ConnectivityManager.NetworkCallback {
private final NetworkRequest networkRequest;
private final ConnectivityManager connectivityManager;
private final Context context;


public NetworkEventReceiver(Context context) {
    this.context = context;
    connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    networkRequest = new NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .build();
}

public void enable() {
    connectivityManager.registerNetworkCallback(networkRequest, this);
}

@Override
public void onAvailable(Network network) {
    executeActions(network);
    super.onAvailable(network);
}

@Override
public void onLost(Network network) {
    executeActions(network);
    super.onLost(network);
}

private void executeActions(Network network) {
    try {
        NetworkCapabilities info = connectivityManager.getNetworkCapabilities(network);

        if (info == null || info.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {

            updateStuff();

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Чтобы включить эту службу

NetworkEventReceiver monitor = new NetworkEventReceiver(this);
monitor.enable();
person Akshay Kumar S    schedule 03.12.2018

Используйте NetworkCapabilities hasCapability()

Что-то вроде этого:

public boolean hasMobileData() {
    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
    return nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}
person Chris Stillwell    schedule 15.11.2018
comment
Это для Wi-Fi или мобильных данных? - person krisDrOid; 05.11.2020
comment
Это работает для любого. Для определения типа сети (Wi-Fi или мобильный). - person Chris Stillwell; 05.11.2020

   ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&
                          activeNetwork.isConnectedOrConnecting();

Приведенный выше код будет работать для вас.

Определите тип вашего интернет-соединения

Для Wi-Fi

boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

Для мобильных устройств

Вы можете сослаться на ответ @Chris Stillwell.

person Jitesh Mohite    schedule 15.11.2018