连接到WiFi编程后,断开几秒钟后

问题描述 投票:6回答:2

我有与用户代表切换WiFi网络的问题。我们有我们需要连接,以便将其设置的物联网设备。使用WifiManagerConnectivityManager,我可以进行连接,甚至使一个REST调用它,但它约10秒后变回。我不明白为什么。有一对夫妇从我肯定是相关的,但我不知道如何解决,主要设备奇怪的日志行:

02-12 15:36:13.441 E/WifiConfigManager: UID 10356 does not have permission to update configuration "REDACTED"NONE
02-12 15:36:13.442 I/WifiStateMachine: connectToUserSelectNetwork Allowing uid 10356 with insufficient permissions to connect=90
...
02-12 15:36:13.470 E/WifiVendorHal: stopRssiMonitoring(l.2156) failed {.code = ERROR_NOT_AVAILABLE, .description = }
02-12 15:36:13.470 W/WifiConfigManager: Looking up network with invalid networkId -1
...
02-12 15:36:16.882 D/WifiStateMachine: NETWORK_STATUS_UNWANTED_VALIDATION_FAILED
...
02-12 15:36:17.041 D/WifiPermissionsUtil: Denied: no location permission

有很多关于在那里的权限,但我认为我要求他们都:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

我问RuntimePermission的用于位置,因为我用SDK 27.更重要的是,它让我接这个测试的设备上,但只是改变了它的心思,几秒钟后。

android
2个回答
4
投票

当您尝试由于Android已经改变了其权限模型扫描与WifiManager.startScan()网络问题引起。您需要检查运行权限访问粗/细位置,你还必须检查位置提供商(GPS)被接通。否则,你不会得到任何位置更新。在你的情况下,位置更新还包含无线网络的SSID,您已扫描。

还要注意,你必须检查,如果通过系统设置,用户没有连接到该设备之前,因为它不是由一个应用程序允许从一个应用程序内连接到用户定义的接入点。为了让应用程序在代表用户重新连接时,用户必须删除/忘记在系统设置中的网络。如果不检查,你会得到从子系统的请求者身份验证错误。

另一个音符物联网的WiFi设备:他们大多是“无头”的接入点,即在没有互联网。许多Android设备有问题,他们需要一个有效的强制网络门户。看到这个问题:https://android.stackexchange.com/questions/130265/stay-connected-to-specific-wifi-which-has-no-internet

为了解决这个问题,必须有一个静态的IP地址进行连接。不过,Android并没有提供API来设置这个程序。所以,你必须使用反射如下陈述:Set static IP and gateway programmatically in Android 6.x (Marshmallow)


2
投票

我试图连接到现有的无线网络配置时,也有过类似的经历,我发现丹尼斯的回答非常有帮助。以下表示运行Android 8.1.0我在Nexus 5X结论。

当所有的工作:

为了维持不具有互联网接入WiFi网络的持久连接,您可能需要调用:

  • (一)bindToProcess()该网络,尽管缺少互联网连接的,它告诉你的应用程序将所有的流量在这个网络上,或
  • (b)您可以配置HTTP客户端使用期望网络的套接字工厂。

如果你做任何的这些与你的应用程序创建一个无线网络配置,系统不会断开网络连接,你由于缺乏互联网接入。

如果他们不这样做:

如果你试图连接到不是由您的应用程序创建的无线网络配置(基于应用程序的UID),你仍然能够连接,并且可以执行(一)或(b),但系统会中断您与很短的时间段之后该网络。这似乎是一个Android的错误给我。该系统允许您连接到你没有创建一个配置,但会报告如下:

UID xxxxx does not have permission to update configuration

connectToUserSelectNetwork Allowing uid xxxxx with insufficient permissions to connect=16

不久后,它会中断您与您配置的网络,它如果不执行完全相同的方式(一)或(b)。这似乎是在任何Android系统的一部分,踢你实现中的错误关闭没有互联网连接的网络。要么你不应该能够连接到网络中的首位,或者它应该让你使用坚持一个连接(一)或(b)。

已被你的应用程序创建一个地方WIFI配置不认为这些案件都是在用户通过系统WiFi设置手动配置该网络,或者当您重新运行Android Studio中的应用程序。所以,如果你调试和配置网络,然后重新运行该应用程序,你将不能够维持到以前配置的网络的持久连接,因为您的UID会有所改变。

解:

实际的解决方案是非常简单的。您只需删除以前的无线网络配置(即使你显然没有“足够”的权限才能正常连接到它!)

// Find an existing network configuration with the SSID you're trying to connect to:
val configuration = wifiManager.configuredNetworks.firstOrNull { network -> network.SSID == "\"YOUR_SSID\"" }

// Remove the configuration
if (configuration != null) {
    wifiManager.removeNetwork(configuration.networkId)
}

现在,您可以创建一个新的配置,连接到它,并且执行(a)或(b)和保持持续的网络连接。

我已经提交了一份bug报告在Android问题追踪:https://issuetracker.google.com/issues/123896447

© www.soinside.com 2019 - 2024. All rights reserved.