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

Posted

技术标签:

【中文标题】ConnectivityManager.NetworkCallback() -> onAvailable(Network network) 方法在设备连接到内部 wifi 网络时不会触发【英文标题】:ConnectivityManager.NetworkCallback() -> onAvailable(Network network) method is not triggered when device connects to a internal wifi network 【发布时间】:2019-06-28 20:27:23 【问题描述】:

我正在尝试通过内部 wifi 网络向 App Center 发送远程数据,但它不在此网络上发送,但它在任何外部网络上发送。调试时发现当设备连接到内部wifi时方法onAvailable()没有被调用,但是当连接到任何外部wifi时它会被调用。

以下代码来自 App Center SDK: appcenter\utils\NetworkStateHelper.javaNetworkStateHelper.java。 类 NetworkStateHelper -> 方法重新打开() -> public void onAvailable(Network network) 方法

示例代码:

private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback() 


    @Override
    public void onAvailable(Network network) 
        onNetworkAvailable(network);
    

    @Override
    public void onLost(Network network) 
        onNetworkLost(network);
    
;

当连接到内部 wifi 网络时,它应该调用 onAvailable 方法。

【问题讨论】:

嗨,你的 gradle 文件中的目标 api 是什么? 是26,compileSdkVersion 26 buildToolsVersion "26.0.2" 我在某些 android 6 设备上遇到了类似的问题。 【参考方案1】:

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

1.构建NetworkRequest

val networkRequest = getNetworkRequest()

private fun getNetworkRequest(): NetworkRequest 
    return NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!
        .build()

2。构建NetworkCallback:

val networkCallback = getNetworkCallBack()

private fun getNetworkCallBack(): ConnectivityManager.NetworkCallback 
    return object : ConnectivityManager.NetworkCallback() 
        override fun onAvailable(network: Network)     //when Wifi is on
            super.onAvailable(network)

            Toast.makeText(requireContext(), "Wifi is on!", Toast.LENGTH_SHORT).show()
        

        override fun onLost(network: Network)     //when Wifi 【turns off】
            super.onLost(network)

            Toast.makeText(requireContext(), "Wifi turns off!", Toast.LENGTH_SHORT).show()
        
    

3.注册和注销:

fun getConnectivityManager() = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

override fun onResume()     //start monitoring when in the foreground
    super.onResume()

    getConnectivityManager().registerNetworkCallback(networkRequest, networkCallback)


override fun onPause()     //stop monitoring when not fully visible
    super.onPause()

    getConnectivityManager().unregisterNetworkCallback(networkCallback)

4.不要忘记权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

【讨论】:

【参考方案2】:

如android中写的docs:

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

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

在你的活动onCreate()

IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(connectivityReceiver, intentFilter);

声明广播:

private BroadcastReceiver connectivityReceiver = new BroadcastReceiver() 
    @Override
    public void onReceive(Context context, Intent intent) 
      //check state here....
    
  ;

【讨论】:

Connectivity-action 自 API 级别 28 developer.android.com/reference/android/net/… 起已弃用。网络回调是现在使用的正确 API,问题中提到的那个。 感谢您的帮助。我使用的是 android 6.0.1,目标 sdk 是 26。 我展示的示例代码来自 App Center SDK,它是只读的。 docs.microsoft.com/en-us/appcenter/sdk/analytics/android @sonu769 你使用 Xamarin 吗? 不只是安卓

以上是关于ConnectivityManager.NetworkCallback() -> onAvailable(Network network) 方法在设备连接到内部 wifi 网络时不会触发的主要内容,如果未能解决你的问题,请参考以下文章