标签: android-connectivitymanager

来自 ConnectivityManager 的具有相同 networkId 的多个随机 NetworkCallbacks (onAvailable)

我不明白为什么在随机时刻多次调用 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)

java android android-connectivitymanager

7
推荐指数
1
解决办法
498
查看次数

如何在Android 9.0(PIE)中获取WIFI SSID?

如何在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

6
推荐指数
2
解决办法
7943
查看次数

ConnectivityManager.NetworkCallback() -> onAvailable(Network network) 方法在设备连接到内部 wifi 网络时不会触发

我正在尝试将远程数据发送到外部 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

6
推荐指数
2
解决办法
8699
查看次数

Android ConnectivityManager onAvailable 有时未返回

我们使用 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)

除了我们遇到的两个问题外,此实现运行良好

  1. 如果我们同时使用 wifi 和移动数据连接到互联网并关闭 wifi 有时会onLost()触发回调onAvailable(),如预期的那样,但在其他情况下 onLost()触发这是不正确的。

  2. 如果我们没有互联网连接并打开应用程序onLost()不会被触发,但是如果我们有互联网连接并打开应用程序 …

android android-connectivitymanager

6
推荐指数
1
解决办法
1933
查看次数

Android Q,以编程方式连接到不同的WiFi AP进行互联网连接

与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

6
推荐指数
3
解决办法
1858
查看次数

建立连接后,通过 WifiNetworkSpecifier 的 Android Q Wifi 连接立即断开连接

我目前正在尝试连接到 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 wifi android-connectivitymanager android-10.0

6
推荐指数
1
解决办法
1906
查看次数

通过以太网获取Android DhcpInfo连接

如何获取通过以太网连接的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)

但是我仍然没有找到通过以太网连接设备的方法...谢谢

networking android wifimanager android-connectivitymanager

5
推荐指数
1
解决办法
2318
查看次数

API 29 中不推荐使用 ConnectivityManager.getActiveNetworkInfo() / NetworkInfo。有什么替代方法?

似乎整个 NetworkInfo在 API 29 上都被弃用了。

所以我正在寻找一种替代方法来检查网络是否已连接。例如替代

connectivityManager.activeNetworkInfo?.isConnected == true
Run Code Online (Sandbox Code Playgroud)

旁注:我知道现在有一个回调,但我想同步获取此信息。另外,当然我知道它可能不是一个精确的信息,尽管我想拥有它。

android android-connectivitymanager

5
推荐指数
1
解决办法
4691
查看次数

WiFi 网络连接在 Android Q 上不断断开连接

我使用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 抛出的日志: …

android android-connectivitymanager android-10.0

5
推荐指数
0
解决办法
516
查看次数

Android 10 (API29) 通过 ConnectivityManager 连接缓存密码并失败

我已经通过 IoT 设备提供的 WiFi 接入点实现了与该设备的连接。我正在使用 ConnectivityManager 的 requestNetwork 方法,并为 WifiNetworkSpecicier 提供 SSID 模式和密码。

问题是 API 29 似乎正在对密码进行某种缓存。首次尝试连接到网络(重新启动后)可以正常工作。每个后续请求都会导致 API 尝试使用之前输入的密码进行连接(忽略传递给它的密码),即使输入错误也是如此。此行为将持续到下次手机重新启动为止。

我已经在 Pixel 3XL、Pixel 2 和 Samsung Note 10+ 上重现了这一点,所以我担心我是否以某种方式滥用了 API。当然,这三款手机均运行 Android 10。

passwords android android-connectivitymanager

5
推荐指数
0
解决办法
365
查看次数