在Android 6中打开wifi时如何为任何应用程序强制使用移动数据

Posted

技术标签:

【中文标题】在Android 6中打开wifi时如何为任何应用程序强制使用移动数据【英文标题】:How to use mobile data forcefully for any application when wifi is on in Android 6 【发布时间】:2017-03-06 02:50:29 【问题描述】:

我希望 android 应用程序在 Android 6仅使用移动数据,即使 WIFI 和移动数据都开启。如何仅将 android 进程绑定到移动数据。 请建议。例子会很好。

【问题讨论】:

【参考方案1】:

如果你的安卓版本是 M 或以上,你可以很容易地做到这一点。 首先,您需要正确的清单权限:

这是一个示例方法,应该可以满足您的需要:

public static void forceConnectionToMobile2(Context context) 
    final ConnectivityManager connection_manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
        NetworkRequest.Builder request = new NetworkRequest.Builder();

        Log.d(TAG,"request TRANSPORT_CELLULAR");
        request.addCapability(NetworkCapabilities.TRANSPORT_CELLULAR);

        connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback() 
            @Override
            public void onAvailable(Network network) 
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                    Log.d(TAG,"binding app to cellular network");
                    connection_manager.bindProcessToNetwork(network);
                
            
        );

    

【讨论】:

我在没有互联网的情况下尝试了这个并打开了蜂窝数据,但我无法使用互联网......【参考方案2】:
boolean mobileDataEnabled = false;

        try 
            Class cmClass = Class.forName(connection_manager.getClass().getName());
            Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
            method.setAccessible(true);
            mobileDataEnabled = (Boolean) method.invoke(connection_manager);
         catch (Exception e) 
        
First check if mobile data enable or disable then do 

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            NetworkRequest.Builder request = new NetworkRequest.Builder();
            request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
            request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

            connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback() 
                @Override
                public void onAvailable(Network network) 
connection_manager.bindProcessToNetwork(network);


【讨论】:

【参考方案3】:

您可以访问Android force app to use mobile data channel

    manager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);

if(manager.isWifiEnabled()) 
    manager.setWifiEnabled(false);

// and to be sure:
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

【讨论】:

我不想在设备级别禁用 WIFI。只想为我的应用使用仅移动数据 boolean mobileDataEnabled = false;尝试 类 cmClass = Class.forName(connection_manager.getClass().getName());方法method = cmClass.getDeclaredMethod("getMobileDataEnabled");方法.setAccessible(true); mobileDataEnabled = (Boolean) method.invoke(connection_manager); 捕捉(异常 e)

以上是关于在Android 6中打开wifi时如何为任何应用程序强制使用移动数据的主要内容,如果未能解决你的问题,请参考以下文章

首次打开页面时如何为 div 的大小调整设置动画 [重复]

在 Flutter 应用程序中单击时如何为下拉按钮中的项目设置填充

在 iOS Swift 中实现方法时如何为闭包命名(语法问题)

更改设备方向时如何为uiimageview设置动画

连接多个设备时如何为特定设备运行 vts

Ruby on Rails:不使用 find 时如何为 SQL 清理字符串?