我不明白为什么在随机时刻多次调用 onAvailable ,文档说明如果网络发生变化可以调用更多,但是 onAvailable 中网络对象参数的属性始终相同。我什至比较了哈希码,它们是相同的......
问题出现在我的 LG 棒棒糖设备上
Android 文档:(https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback)
onAvailable 在 API 级别 21 中添加当框架连接并声明新网络可供使用时调用。如果满足请求的网络发生变化,则此回调可能会被多次调用
编辑:我已经从回调中实现了其他方法来检查是否有任何其他方法被触发(onLosing、onUnavailable、onCapabilitiesChanged、onLinkPropertiesChanged),但这些方法都没有被调用
我有自己的 NetworkManager,其中包含以下代码:
public void initialize(Context context) {
connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
setState();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
final NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
connectivityManager.registerNetworkCallback(networkRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(final Network network) {
super.onAvailable(network);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
Log.d(TAG,"Network is Available. Network Info: " + networkInfo);
notifyObservers();
}
@Override
public void onLost(final Network network) {
super.onLost(network);
notifyObservers(); …Run Code Online (Sandbox Code Playgroud) 如何在Android 9.0(PIE)中获取WIFI SSID?我的代码在android 8.1.0之前可以正常工作,但在android 9.0上却无法正常工作
ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
WifiManager wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wifiInfo.getSSID();
String name = networkInfo.getExtraInfo();
String ssid = "\"" + wifiInfo.getSSID() + "\"";
}
Run Code Online (Sandbox Code Playgroud)
但是此代码不适用于Android 9.0
android android-wifi networkinfo android-connectivitymanager android-9.0-pie
我正在尝试将远程数据发送到外部 wifi 网络上的 App Center,但它不是在这个网络上发送,而是在任何外部网络上发送。调试时发现方法 onAvailable() 在设备连接到内部 wifi 时不会被调用,但在连接到任何外部 wifi 时会被调用。
下面的代码来自 App Center SDK:
appcenter\utils\NetworkStateHelper.javaNetworkStateHelper.java。类 NetworkStateHelper -> 方法重新打开()--> public void onAvailable(网络网络)方法
示例代码:
private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback()
{
@Override
public void onAvailable(Network network) {
onNetworkAvailable(network);
}
@Override
public void onLost(Network network) {
onNetworkLost(network);
}
};
Run Code Online (Sandbox Code Playgroud)
当连接到内部 wifi 网络时,它应该调用 onAvailable 方法。
android network-connection android-connectivitymanager visual-studio-app-center
我们使用 AndroidConnectivityManager来监听我们的应用程序内的互联网连接变化,如下所示。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
ConnectionStateMonitor().enable(this)
}
class ConnectionStateMonitor : NetworkCallback() {
private val networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()
fun enable(context: Context) {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerNetworkCallback(networkRequest, this)
}
override fun onAvailable(network: Network) {
Log.i(TAG, "onAvailable ")
}
override fun onLost(network: Network?) {
super.onLost(network)
Log.i(TAG, "onLost ")
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了我们遇到的两个问题外,此实现运行良好
如果我们同时使用 wifi 和移动数据连接到互联网并关闭 wifi 有时会onLost()触发回调onAvailable(),如预期的那样,但在其他情况下仅 onLost()触发这是不正确的。
如果我们没有互联网连接并打开应用程序onLost()不会被触发,但是如果我们有互联网连接并打开应用程序 …
与Android Q中一样,几个WiFi API也受到限制。我正在尝试使用备用API连接到Internet的不同Wifi AP。
下面是我的代码:
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("wifi-ap-ssid");
builder.setWpa2Passphrase("wifi-ap-password");
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest nr = networkRequestBuilder1.build();
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(nr, callback);
Run Code Online (Sandbox Code Playgroud)
这使我可以连接,但互联网已禁用。这正在按照Android文档中的定义运行。
我尝试的替代方法如下:
WifiNetworkSuggestion.Builder wifiNetworkSuggestionBuilder1 = new WifiNetworkSuggestion.Builder();
wifiNetworkSuggestionBuilder1.setSsid("wifi-ap-ssid");
wifiNetworkSuggestionBuilder1.setWpa2Passphrase("wifi-ap-password");
WifiNetworkSuggestion wifiNetworkSuggestion = wifiNetworkSuggestionBuilder1.build();
List<WifiNetworkSuggestion> list = new ArrayList<>();
list.add(wifiNetworkSuggestion);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.removeNetworkSuggestions(new ArrayList<WifiNetworkSuggestion>());
wifiManager.addNetworkSuggestions(list);
Run Code Online (Sandbox Code Playgroud)
在清单中声明允许:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
Run Code Online (Sandbox Code Playgroud)
使用它并没有改变任何行为。
请告知API序列,以成功连接到具有Internet功能的其他Wifi AP。
android android-wifi android-developer-api android-connectivitymanager android-10.0
我目前正在尝试连接到 wifi 网络。我使用了下面的代码。
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setBssid(MacAddress.fromString(bssid))
.setWpa2Passphrase(password)
.build();
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
super.onAvailable(network);
NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (info != null && info.isConnectedOrConnecting()) {
if (!emitter.isDisposed()) {
emitter.onSuccess(true);
}
} else {
if (!emitter.isDisposed()) {
emitter.onError(new RuntimeException("OS Disconnected"));
}
}
}
@Override
public void onUnavailable() {
super.onUnavailable();
if (!emitter.isDisposed()) {
emitter.onError(new RuntimeException("Could not connect Wifi")); …Run Code Online (Sandbox Code Playgroud) 如何获取通过以太网连接的android设备的DhcpInfo()(网关ip,netmask,dns等)?
如果设备通过Wifi连接并使用ACCESS_WIFI_STATE权限,我知道如何获取它:
WifiManager wifi = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
Run Code Online (Sandbox Code Playgroud)
但是我仍然没有找到通过以太网连接设备的方法...谢谢
似乎整个 NetworkInfo在 API 29 上都被弃用了。
所以我正在寻找一种替代方法来检查网络是否已连接。例如替代
connectivityManager.activeNetworkInfo?.isConnected == true
Run Code Online (Sandbox Code Playgroud)
旁注:我知道现在有一个回调,但我想同步获取此信息。另外,当然我知道它可能不是一个精确的信息,尽管我想拥有它。
我使用WiFi 网络请求 API连接到 android Q 上的网络。连接可用但丢失。这是我的代码
public void registerNetworkCallback() {
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
.setSsid("r_guest").setWpa2Passphrase("guest").build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.setNetworkSpecifier(specifier)
.build();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d(TAG, "ConnectivityManager onAvailable");
}
@Override
public void onLost(Network network) {
Log.d(TAG, "ConnectivityManager onLost");
}
);
} catch (Exception e) {
}
}
Run Code Online (Sandbox Code Playgroud)
这些是 NetworkCallBack 抛出的日志: …
我已经通过 IoT 设备提供的 WiFi 接入点实现了与该设备的连接。我正在使用 ConnectivityManager 的 requestNetwork 方法,并为 WifiNetworkSpecicier 提供 SSID 模式和密码。
问题是 API 29 似乎正在对密码进行某种缓存。首次尝试连接到网络(重新启动后)可以正常工作。每个后续请求都会导致 API 尝试使用之前输入的密码进行连接(忽略传递给它的密码),即使输入错误也是如此。此行为将持续到下次手机重新启动为止。
我已经在 Pixel 3XL、Pixel 2 和 Samsung Note 10+ 上重现了这一点,所以我担心我是否以某种方式滥用了 API。当然,这三款手机均运行 Android 10。
android ×10
android-connectivitymanager ×10
android-10.0 ×3
android-wifi ×2
java ×1
networkinfo ×1
networking ×1
passwords ×1
wifi ×1
wifimanager ×1