如何在android 6和android 7中以编程方式关闭LTE数据连接?

时间:2017-01-19 18:35:38

标签: android-wifi android-networking android-7.0-nougat android-6.0.1-marshmallow

我想以这种方式联系路由器:

isReachable = InetAddress.getByName("192.168.1.1").isReachable(2000);

但它返回false。

奇怪的是,当我手动关闭LTE数据时,它可以工作。

我发现此代码以编程方式打开/关闭LTE数据,但它在Android 6或7上不起作用。

private void setMobileDataEnabled(Context context, boolean enabled) 
{
    final ConnectivityManager conman = (ConnectivityManager)    
    final ConnectivityManager conman = (ConnectivityManager)   
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final Class conmanClass = Class.forName(conman.getClass().getName());
    final Field iConnectivityManagerField = 
    conmanClass.getDeclaredField("mService");
    iConnectivityManagerField.setAccessible(true);
    final Class iConnectivityManagerClass =  
    Class.forName(iConnectivityManager.getClass().getName());
    final Method setMobileDataEnabledMethod = 
    iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", 
    Boolean.TYPE);
    setMobileDataEnabledMethod.setAccessible(true);
    setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}

你能帮忙找到另一种在Android 6或7上打开/关闭LTE数据的方法吗?

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。我无法以编程方式关闭手机数据,但如果找到一种方法强制我的应用程序只使用wifi连接。这是代码:

final ConnectivityManager connectivityManager  = 
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

 NetworkRequest.Builder request = null;
  if (android.os.Build.VERSION.SDK_INT >=                                          
android.os.Build.VERSION_CODES.LOLLIPOP) {
        request = new NetworkRequest.Builder();

        request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

        connectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {

        @Override
        public void onAvailable(Network network) {
            //if (SDK_INT >= LOLLIPOP && SDK_INT <= M) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                ConnectivityManager.setProcessDefaultNetwork(network);
            }

            }
    });
    }