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

son*_*769 6 android network-connection android-connectivitymanager visual-studio-app-center

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

Sam*_*hen 14

您必须将网络类型限制为Wifi

\n

1. 构建NetworkRequest

\n
val networkRequest = getNetworkRequest()\n\nprivate fun getNetworkRequest(): NetworkRequest {\n    return NetworkRequest.Builder()\n        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!\n        .build()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

2. 构建NetworkCallback

\n
val networkCallback = getNetworkCallBack()\n\nprivate fun getNetworkCallBack(): ConnectivityManager.NetworkCallback {\n    return object : ConnectivityManager.NetworkCallback() {\n        override fun onAvailable(network: Network) {    //when Wifi is on\n            super.onAvailable(network)\n\n            Toast.makeText(requireContext(), "Wifi is on!", Toast.LENGTH_SHORT).show()\n        }\n\n        override fun onLost(network: Network) {    //when Wifi \xe3\x80\x90turns off\xe3\x80\x91\n            super.onLost(network)\n\n            Toast.makeText(requireContext(), "Wifi turns off!", Toast.LENGTH_SHORT).show()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

3. 注册和注销:

\n
fun getConnectivityManager() = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n\noverride fun onResume() {    //start monitoring when in the foreground\n    super.onResume()\n\n    getConnectivityManager().registerNetworkCallback(networkRequest, networkCallback)\n}\n\noverride fun onPause() {    //stop monitoring when not fully visible\n    super.onPause()\n\n    getConnectivityManager().unregisterNetworkCallback(networkCallback)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

4.不要忘记权限:

\n
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n
Run Code Online (Sandbox Code Playgroud)\n
\n

演示: https: //youtu.be/RPRcGbuB6eI

\n


Mak*_*kov 2

正如 android文档中所写:

如果面向 Android 7.0(API 级别 24)及更高版本的应用在清单中声明了广播接收器,则它们不会收到 CONNECTIVITY_ACTION 广播。如果应用程序使用 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则应用程序仍将收到 CONNECTIVITY_ACTION 广播。

这意味着如果您的目标 api 高于 24,您需要在活动开始时注册广播接收器。

在你的活动中onCreate()

IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(connectivityReceiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

声明广播:

private BroadcastReceiver connectivityReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //check state here....
    }
  };
Run Code Online (Sandbox Code Playgroud)

  • 自 API 级别 28 起,Connectivity-action 已弃用 https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION。网络回调是现在使用的正确 API,即问题中提到的 API。 (10认同)