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 网络时不会触发的主要内容,如果未能解决你的问题,请参考以下文章