Android ConnectionManager.NetworkCallback()->;当设备连接到内部wifi网络时,不会触发可用(网络)方法

Android ConnectionManager.NetworkCallback()->;当设备连接到内部wifi网络时,不会触发可用(网络)方法,android,visual-studio-app-center,network-connection,android-connectivitymanager,Android,Visual Studio App Center,Network Connection,Android Connectivitymanager,我正在尝试通过内部wifi网络将远程医疗数据发送到App Center,但它不是通过此网络发送,而是通过任何外部网络发送。调试发现,当设备连接到内部wifi时,不会调用onAvailable()方法,但当连接到任何外部wifi时,会调用该方法 以下代码来自App Center SDK: appcenter\utils\NetworkStateHelper.javaNetworkStateHelper.java。 类NetworkStateHelper->Method reboon()-->pub

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

以下代码来自App Center SDK:
appcenter\utils\NetworkStateHelper.javaNetworkStateHelper.java。 类NetworkStateHelper->Method reboon()-->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);
    }
};
当连接到内部wifi网络时,它应该调用onAvailable方法。

如android中所述:

针对Android 7.0(API级别24)及更高版本的应用程序不会收到 如果他们声明了广播接收器,则连接性\u操作广播 在他们的舱单上。应用程序仍将接收连接操作 如果他们将其广播接收器注册到 并且该上下文仍然有效

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

在您的活动中
onCreate()

宣布广播:

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

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

1。构建
网络请求

val networkRequest = getNetworkRequest()

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!
        .build()
}
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()
        }
    }
}
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)
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2。构建
网络回调

val networkRequest = getNetworkRequest()

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!
        .build()
}
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()
        }
    }
}
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)
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3。注册和注销:

val networkRequest = getNetworkRequest()

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!
        .build()
}
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()
        }
    }
}
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)
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4。不要忘记权限:

val networkRequest = getNetworkRequest()

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //here!!
        .build()
}
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()
        }
    }
}
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)
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />



演示:

Hi,gradle文件中的目标api是什么?它是26,编译DKVersion 26 buildToolsVersion“26.0.2”。对于一些Android 6设备,我也有类似的问题。Connectivity-action从api级别28开始就不推荐使用。问题中提到的网络回调是现在使用的正确API。感谢您的帮助。我使用的是android 6.0.1,目标sdk是26。我展示的示例代码来自App Center sdk,它是只读的@sonu769你使用Xamarin吗?不,只有android