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。
\n1. 构建NetworkRequest:
val networkRequest = getNetworkRequest()\n\nprivate fun getNetworkRequest(): NetworkRequest {\n return NetworkRequest.Builder()\n .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) //here!!\n .build()\n}\nRun Code Online (Sandbox Code Playgroud)\n2. 构建NetworkCallback:
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}\nRun Code Online (Sandbox Code Playgroud)\n3. 注册和注销:
\nfun 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}\nRun Code Online (Sandbox Code Playgroud)\n4.不要忘记权限:
\n<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\nRun Code Online (Sandbox Code Playgroud)\n演示: https: //youtu.be/RPRcGbuB6eI
\n正如 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)
| 归档时间: |
|
| 查看次数: |
8699 次 |
| 最近记录: |