【问题标题】:How to know programmatically whether MobileData is enabled on Android P?如何以编程方式知道 Android P 上是否启用了 MobileData?
【发布时间】:2018-11-15 16:40:06
【问题描述】:

有没有办法以编程方式检查 Android P 上是否启用了 MobileData?

在 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

有什么想法吗?

【问题讨论】:

    标签: android android-9.0-pie


    【解决方案1】:

    使用下面的类

    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();
    

    【讨论】:

      【解决方案2】:

      使用NetworkCapabilitieshasCapability()

      所以是这样的:

      public boolean hasMobileData() {
          ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
          return nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
      }
      

      【讨论】:

      • 这是wifi还是移动数据?
      • 两者都适用。您可以使用hasTransport 来确定网络类型(wifi 或移动)。
      【解决方案3】:
         ConnectivityManager cm =
                  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
      
          NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
          boolean isConnected = activeNetwork != null &&
                                activeNetwork.isConnectedOrConnecting();
      

      上面的代码对你有用。

      确定您的互联网连接类型

      无线上网

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

      手机版

      你可以参考@Chris Stillwell 的回答。

      【讨论】:

        猜你喜欢
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        • 2021-06-16
        • 2017-02-11
        • 1970-01-01
        • 2011-06-18
        相关资源
        最近更新 更多