我正在构建一个android应用程序,需要通信通过WiFi网络,将没有任何互联网接入。问题是,即使连接了WiFi,在没有网络连接的情况下,android也会选择使用蜂窝/移动数据。
我读了很多关于这个问题的帖子,其中很多涉及到设备生根,但这是不可能的生产应用程序(生根设备是不一个选项)。其他解决方案(如我下面的代码)建议使用bindProcessToNetwork(),它在我的索尼Z2上工作得很好,但在我测试过的其他设备上不能(都运行6.0.1)
私人无效bindToNetwork(){最后ConnectivityManagerconnectivityManager=(ConnectivityManager)mActivity.getSystemService(上下文.CONNECTIVITY_SERVICE);NetworkRequest.构建器构建器;如果(构建.版本.SDK_INT>=构建.VERSION_CODES.棒棒糖){构建器=新NetworkRequest.构建器();//设置传输类型do WIFI构建器.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);connectivityManager.requestNetwork(构建器.构建(),新ConnectivityManager.NetworkCallback(){@Override公共无效onAvailable(网络网络){如果(构建.版本.SDK_INT>=构建.VERSION_CODES.米){connectivityManager.bindProcessToNetwork(零);如果(barCodeData.getSsid().包含(“screenspace”)){connectivityManager.bindProcessToNetwork(网络);}}其他的{//该方法在API级别23中已弃用ConnectivityManager.setProcessDefaultNetwork(零);如果(barCodeData.getSsid().包含(“screenspace”)){ConnectivityManager.setProcessDefaultNetwork(网络);}}connectivityManager.unregisterNetworkCallback(这);}});}}
你可以检查是否连接了wifi,然后继续显示一个对话框给用户,要求他连接到wifi网络
由于方法NetworkInfo.isConnected()在API-23中已弃用,这里有一个方法可以检测Wi-Fi适配器是否开启,并且也使用WifiManager连接到接入点:
私人布尔checkWifiOnAndConnected(){WifiManagerwifiMgr=(WifiManager)getSystemService(上下文.WIFI_SERVICE);如果(wifiMgr.isWifiEnabled()){// Wi-Fi适配器已开启WifiInfowifiInfo=wifiMgr.getConnectionInfo();如果(wifiInfo.getNetworkId()==-1){返回假;//没有连接到访问点}返回真正的;//连接到一个接入点}其他的{返回假;// Wi-Fi适配器关闭}}