我正在构建一个需要通过没有任何互联网访问的WiFi网络进行通信的android应用程序。问题是,即使连接了WiFi,当wifi网络上没有连接互联网时,android也会选择使用蜂窝/移动数据。
我读了很多关于这个问题的帖子,其中很多都涉及到为设备找根,但这在生产应用程序中是不可能的(为设备找根不是一个选项)。其他解决方案(如下面的代码)建议使用< code > bindProcessToNetwork(),它在我的Sony Z2上运行得很好,但在我测试过的其他设备上却不行(所有设备都运行6.0.1)
private void bindToNetwork() {
final ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new NetworkRequest.Builder();
//set the transport type do WIFI
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
if (barCodeData.getSsid().contains("ap-name")) {
connectivityManager.bindProcessToNetwork(network);
}
} else {
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(null);
if (barCodeData.getSsid().contains("ap-name")) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
}
connectivityManager.unregisterNetworkCallback(this);
}
});
}
}
静态编程语言解决方案
class ConnectWithoutInternetTest constructor(
private val mContext: Context,
private val connectivityManager: ConnectivityManager,
private val wifiManager: WifiManager
) {
private val mWifiBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
WifiManager.NETWORK_STATE_CHANGED_ACTION -> {
val info = intent.getParcelableExtra<NetworkInfo>(WifiManager.EXTRA_NETWORK_INFO)
val isConnected = info.isConnected
val ssid: String? = normalizeAndroidWifiSsid(wifiManager.connectionInfo?.ssid)
if (isConnected) {
val builder = NetworkRequest.Builder()
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
connectivityManager.registerNetworkCallback(
builder.build(),
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
val networkInfo = connectivityManager.getNetworkInfo(network)
val networkSsid = networkInfo.extraInfo
if (networkSsid == ssid) {
connectivityManager.unregisterNetworkCallback(this)
}
}
})
}
}
}
}
}
private fun init() {
val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
mContext.registerReceiver(mWifiBroadcastReceiver, intentFilter)
}
private fun destroy() {
mContext.unregisterReceiver(mWifiBroadcastReceiver)
}
private fun normalizeAndroidWifiSsid(ssid: String?): String? {
return ssid?.replace("\"", "") ?: ssid
}
fun connectToWifi(ssidParam: String, password: String?) {
init()
val ssid = "\"$ssidParam\""
val config = wifiManager.configuredNetworks.find { it.SSID == ssid }
val netId = if (config != null) {
config.networkId
} else {
val wifiConfig = WifiConfiguration()
wifiConfig.SSID = ssid
password?.let { wifiConfig.preSharedKey = "\"$password\"" }
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
wifiManager.addNetwork(wifiConfig)
}
wifiManager.disconnect()
val successful = wifiManager.enableNetwork(netId, true)
}
你需要在设置中禁用移动数据(不确定,如果这可以通过编程来完成,这可能是一个可行的选择)——或者去掉USIM;
否则,常见的行为是,它将始终返回到最佳可用连接(而与Internet网关的连接可能是首选,因为它被大多数应用程序使用)。
也看这个答案。
您可以通过将captive _ portal _ detection _ enabled设置为0 (false)来解决此问题。
实际发生的是,默认情况下,每次你连接到一个wifi,固件会测试一个服务器(通常是谷歌),看看它是否是一个强制wifi(需要登录)。所以如果你的wifi没有连接谷歌,这个检查就失败了。之后,设备知道wifi没有互联网连接,并且不会自动连接到它。
将此设置设置为0将避免此检查。
编程方式:<code>Settings.Global。putin(getContentResolver(),Settings.Global。Capture_PORTAL_DETECTION_ENABLED,0)
编辑:您可能需要直接使用字符串“Capture_portal_detection_enabled”,而不是根据Android版本不可见的常量。
我正在开发一款嵌入式设备,它可以通过WiFi与iPad(仅限WiFi)进行通信。但是,这些设备未连接到internet。它们只是连接到一个特定的端口,该端口不断地转发某些信息。iPad连接到接入点,从DHCP接收IP地址,现在可以到达所需的位置 我看到的是频繁的断开连接,或连接中断。 我的怀疑是iPad无法连接到导致它重新扫描WiFi网络或以其他方式暂时中断连接。 有没有办法禁用这种行为,或者确保
我开Android Studio已经有一段时间了。直到今天都很好。今天android模拟器不能连接到互联网(用chrome浏览器和我在模拟器中的应用程序尝试),尽管它的wifi是连接的。怎么解决这个? 我已经试过了: null 模拟器wifi设置(自动ip/dhcp):Nexus 5s Api 28 IP地址:192.168.232.2 网关:192.168.232.1 子网掩码:255.255.
我在mac OS HS 10.13.4上直接连接到我的路由器,没有代理。 我甚至试着删除所有的AVD,重新安装它们。我甚至试着用奥利奥Android 8.1安装了最新的Pixel 2 似乎什么都不起作用。有人面对这个问题并找到解决办法吗?
问题内容: 我的工作正常,但现在停止了。我尝试了以下命令,但无济于事: -在主机和容器上 我所得到的是。Docker版本0.7.0 有任何想法吗? PS也禁用 问题答案: 遵循以下建议进行修复: […]您可以尝试重设所有内容吗? 它将迫使docker重新创建网桥并重新初始化所有网络规则 https://github.com/dotcloud/docker/issues/866#issuecomme
我让它正常工作,但现在它停止了。我尝试了以下命令,但没有用: -在主机和容器上 我得到的是未知主机google。com。Docker版本0.7.0 有什么想法吗? P、 S.ufw也被禁用
我有一个Android注册应用程序。当移动设备和计算机都连接到同一个wifi上时,它运行良好。但是,如果移动设备的互联网连接关闭,则会出现一条吐司消息 'java.net.连接异常:2500ms后连接到/100.118.242.179(端口80)失败:isConnted失败: ECONNREFUSED(连接被拒绝)'。 如何在移动设备上没有互联网连接的情况下运行该应用程序?