标签: android-connectivitymanager

不推荐使用ConnectivityManager getNetworkInfo(int)

使用compileSdkVersion 23,但是尝试支持9到9.

getNetworkInfo(int)在23中已弃用.建议改为使用getAllNetworks和getNetworkInfo(Network).然而,这两者都需要最少的API 21.

我们可以在支持包中使用哪个类可以帮助解决这个问题吗?

我知道之前提出了一个解决方案,但是我对9的最小api要求的挑战造成了问题.

networking android android-6.0-marshmallow android-connectivitymanager

122
推荐指数
9
解决办法
7万
查看次数

如何处理wifi和移动数据之间的网络变化?

我正在建立一个VoIP应用程序.当用户在WiFi与移动数据之间切换时,在VoIP呼叫期间,我在处理场景时遇到问题.

在我的通话屏幕活动中,我已注册接收器,这有助于我获得有关网络更改方案的通知.

这是我用于检测onRecieve方法中网络变化的代码.

conn_name是包含先前连接名称的私有类级别变量.

ConnectivityManager connectivity_mgr = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    NetworkInfo net_info = connectivity_mgr.getActiveNetworkInfo();

    if (net_info != null && net_info.isConnectedOrConnecting() && !conn_name.equalsIgnoreCase("")) {
        new_con = net_info.getExtraInfo();        
        if (new_con != null && !new_con.equalsIgnoreCase(conn_name))
            network_changed = true;
        conn_name = (new_con == null) ? "" : new_con;
        connectionStatus ="connected";        
    } else {
        if (net_info != null && conn_name.equalsIgnoreCase("")){
            conn_name = net_info.getExtraInfo();
            connectionStatus ="connected";
            network_changed = true;
        }else if(!new_con.equals(conn_name)) {    
            conn_name = "";
            connectionStatus ="disconnected";
            network_changed = true;          
        }        
    }
Run Code Online (Sandbox Code Playgroud)



所以使用上面的方法我能够检测网络变化.但是当我与WiFi连接时会发生一件奇怪的事情.
当我的应用程序最初启动时,它与移动数据连接.当用户进入他已知的WiFi区域时,他连接到他已知的WiFi.由于WiFi总是被选为默认路由,因此android会切换到WiFi,我会收到WiFi已经打开的网络通知.所以我将我的应用IP地址更新为WiFi IP地址.这里没有问题.但是移动数据仍然是连接的同时getActiveNetworkInfo() …

networking android android-wifi mobile-data android-connectivitymanager

19
推荐指数
1
解决办法
8383
查看次数

Android 10 / API 29:如何将手机连接到配置的网络?

我正在开发一个应用程序,用户必须在其中执行以下步骤:

  1. 将手机连接到wifi;
  2. 将手机从连接的对象连接到专用热点。

当用户连接到所连接对象的专用热点时,应用程序会执行一些 HTTP 请求以对其进行配置。然后,我想将应用程序自动重新连接到步骤 1 的全局 wifi。

从 API 21 到 API 28,此功能非常容易实现,因为我知道 SSID,我也想重新连接手机。它可以通过几行代码完成:

private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
    val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

    var ssidIdentifier: Int? = null

    wifiManager.configuredNetworks?.forEach { config ->
        Log.d("SSID", config.SSID)

        if (config.SSID == "\"${ssidToConnect}\"") {
            ssidIdentifier = config.networkId
        }
    }

    ssidIdentifier?.let { id ->
        wifiManager.enableNetwork(id, true)
    }
}
Run Code Online (Sandbox Code Playgroud)

在 API 29 上,根据这篇文章,这个简单的代码不再起作用:https : //developer.android.com/about/versions/10/privacy/changes#configure-wifi

根据文章,现在,我应该使用 2 个类:WifiNetworkSpecifier和/或WifiNetworkSuggestion.

不幸的是,我找不到使用这些类的工作示例来将用户连接到以前配置的 SSID。

有人已经做到了吗?

预先感谢您的帮助。

android android-wifi android-connectivitymanager

15
推荐指数
2
解决办法
8329
查看次数

尝试在 android 11 上获取网络功能时出现安全异常

我在尝试访问以下代码时收到 SecurityException 和 RemoteException。应用程序接口

val networkCapabilities =connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)

异常获取

Fatal Exception: java.lang.SecurityException: Package android does not belong to 10319
           at android.os.Parcel.createExceptionOrNull(Parcel.java:2385)
           at android.os.Parcel.createException(Parcel.java:2369)
           at android.os.Parcel.readException(Parcel.java:2352)
           at android.os.Parcel.readException(Parcel.java:2294)
           at android.net.IConnectivityManager$Stub$Proxy.getNetworkCapabilities(IConnectivityManager.java:3347)
           at android.net.ConnectivityManager.getNetworkCapabilities(ConnectivityManager.java:1549)

Caused by android.os.RemoteException: Remote stack trace:
        at android.app.AppOpsManager.checkPackage(AppOpsManager.java:7783)
        at com.android.server.ConnectivityService.getNetworkCapabilities(ConnectivityService.java:2297)
        at android.net.IConnectivityManager$Stub.onTransact(IConnectivityManager.java:1357)
        at android.os.Binder.execTransactInternal(Binder.java:1195)
        at android.os.Binder.execTransact(Binder.java:1159)
Run Code Online (Sandbox Code Playgroud)

我分析它,当我深入到AOSP代码,我得到的流量将会checkPackage从AppOpsManager类随附的屏幕截图,并从我们所知道的代码所示的方法,只要检查包的条件不等于MODE_ALLOWED那么只有我们将得到安全例外。但我没有。想法何时该条件会失败。

如果有人对此有任何想法,请帮助我,谢谢

在此处输入图片说明

在此处输入图片说明

android exception android-source android-app-ops android-connectivitymanager

14
推荐指数
1
解决办法
1193
查看次数

registerDefaultNetworkCallback和registerNetworkCallback之间的区别

我在更新API 28的Android应用程序时遇到了registerDefaultNetworkCallbackregisterNetworkCallback.

审阅了文档后,我找不到注册网络回调和注册默认 网络回调之间的区别.

什么时候会用哪个?

提前致谢 :)

android network-programming callback android-connectivitymanager

10
推荐指数
3
解决办法
1017
查看次数

Android Q 总是重复使用第一个输入的凭据连接到 WiFi 网络

我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的更新凭据之后也是如此。

这是流程:

  1. 连接AP成功。
  2. 更改 WiFi 网络的密码。
  3. 运行应用程序,尝试使用更新的凭据(提供新的有效密码)再次连接,但应用程序无法连接到 WiFi(身份验证失败)。

如果我颠倒逻辑,同样的事情会发生:

  1. 成功连接到WiFi。
  2. 运行该应用程序,为其提供更新的凭据(新的、假密码),但该应用程序设法连接到 WiFi。

关键是,一旦它使用有效凭据连接到 SSID,无论我放入 WifiNetworkSpecifier 的任何内容似乎都没有任何区别,它只是一遍又一遍地使用最后一个有效凭据。

这发生在 Google Pixel 2 和华为 P30 Lite 上。但是,在三星 Galaxy S9 上一切正常(如果我更新 WiFi 网络密码并为应用程序提供新的有效密码,应用程序将连接到 WiFi 网络;如果我提供它,它将无法连接到 WiFi假密码,假设我们之前成功连接到 WiFi)。

重启设备后,Pixel 和华为的问题得到“解决”,但是当我再次连接到 WiFi 时(输入有效凭据),我们又回到了同样的问题。

我不确定我是否在这里遗漏了一些微不足道的东西,但任何帮助将不胜感激!谢谢!

编辑:事实证明,您不必输入有效凭据即可触发此循环。例如,如果您第一次尝试使用虚假密码连接AP,并且在尝试使用正确密码连接后,系统会使用此错误密码(第一次输入的密码)进行连接。同样,这种情况发生在 Pixel 2 和华为 P30 Lite 上,但在 Galaxy S9 和 S9+ 上运行良好。重新启动手机仍会清除此“状态”。

这是代码:

    @RequiresApi(api = Build.VERSION_CODES.Q)
    private fun connectToWiFiOnQ(context: Context, wifiCredentials: WifiCredentials) {
        val connectivityManager: ConnectivityManager =
            context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        val …
Run Code Online (Sandbox Code Playgroud)

android android-networking android-wifi android-connectivitymanager android-10.0

10
推荐指数
0
解决办法
526
查看次数

ConnectivityManager.requestNetwork() 未按预期工作

我正在尝试暂时强制设备使用移动数据。我在用ConnectivityManager.requestNetwork()

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

    connectivityManager.requestNetwork(request.build(), newRequestTransportCallback(connectivityManager),
            (int) TimeUnit.SECONDS.toMillis(10));
Run Code Online (Sandbox Code Playgroud)

哪里newRequestTransportCallback()的回报,

new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                Log.d(TAG,"Network available: " + network + ", binding...");
                if (cm.bindProcessToNetwork(network)) {
                    Log.d(TAG,"Bind successful to network: " + network);
                } else {
                    Log.w(TAG,"Bind failed to network: " + network);
                }
            }

            @Override
            public void onUnavailable() {
                Log.w(TAG,"Network not available");
            }
        };
Run Code Online (Sandbox Code Playgroud)

我可以从我的日志语句中看到请求和绑定成功。但是,当我随后调用ConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)它时,它告诉我网络已断开连接(并且我尝试轮询以查看更新网络信息是否有延迟,但也没有成功)。

android android-networking android-connectivitymanager

8
推荐指数
0
解决办法
1503
查看次数

当互联网关闭然后应用程序在 NetworkCallback 内启动时无法获得回调

根据官方文档,由于 getActiveNetworkInfo 现在在 Android 中已被弃用,因此我使用下面的实现来获取有关互联网连接的回调。

private val connectivityManager: ConnectivityManager by lazy {
   getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
}

private val builder: NetworkRequest.Builder by lazy {
   NetworkRequest.Builder()
}

private val networkCallback: NetworkCallback by lazy {
   object : NetworkCallback() {
      override fun onAvailable(network: Network?) {
          println("Connection is online")
      }

      override fun onLost(network: Network?) {
          println("Connection is offline")
      }
   }
}

override fun onResume() {
   super.onResume()
   connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
}

override fun onPause() {
   super.onPause()
   connectivityManager.unregisterNetworkCallback(networkCallback)
}
Run Code Online (Sandbox Code Playgroud)

当连接在线时注册此回调时,它可以正常工作,但当互联网关闭然后我们注册回调时,它不能正常工作。为了测试这种情况,我关闭了我的应用程序。然后保持互联网连接关闭,然后打开应用程序。

我们有什么办法知道应用程序正在打开吗?如果有的话,请帮忙分享一下。谢谢。

android android-connectivitymanager

8
推荐指数
1
解决办法
1340
查看次数

VPN 连接/断开连接时 ConnectivityManager.NetworkCallback 调用丢失

我的 Android 应用程序已注册 ConnectivityManager onAvailable 和 onLost NetworkCallbacks,但当 VPN(我正在使用 OpenVPN 应用程序进行测试)连接或断开连接时,不会调用它们。当蜂窝网络连接/断开时,他们确实会被呼叫。

在我连接 VPN 之前,allNetworks 显示一个网络:

11-17 16:16:22.719 23531 23531 I Baresip : 找到网络 106 [ 传输:蜂窝功能:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:LinkUpBandwidth>=5 1200Kbps LinkDnBandwidth>=102400Kbps 说明符:<6>]

连接VPN后,有两个网络:

11-17 16:17:17.464 23531 23531 I Baresip : 找到网络 106 [ 传输:蜂窝功能:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:LinkUpBandwidth>=5 1200Kbps LinkDnBandwidth>=102400Kbps 说明符:<6>]

11-17 16:17:17.466 23531 23531 I Baresip : 找到网络 225 [ 传输:VPN 功能:INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:]

但是,当 VPN 网络可用时,我的应用程序不会收到有关它的可用(或任何其他)ConnectivityManager 通知。同样的问题,当我断开 VPN 时。

这是 Android 错误还是有其他方法可以获取有关 VPN 事件的通知?

编辑:我搜索了谷歌的问题跟踪器并发现了完全相同的问题:

https://issuetracker.google.com/issues/138035152

不幸的是,作者没有提供谷歌要求的所有信息,他们关闭了这个问题。

我创建了一个新的错误报告,但很可能它不会导致任何结果:

https://issuetracker.google.com/issues/173534857

因此,欢迎社区的帮助。

vpn android android-connectivitymanager

8
推荐指数
1
解决办法
1318
查看次数

来自 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
查看次数