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

问题描述 投票:0回答:3

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

以下代码来自 App Center SDK :
应用程序中心\实用程序\NetworkStateHelper.javaNetworkStateHelper.java。 类 NetworkStateHelper -> 方法 reopen() --> 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方法。

android visual-studio-app-center network-connection android-connectivitymanager
3个回答
11
投票

您必须将网络类型限制为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
投票

As written in the android docs :

针对 Android 7.0(API 级别 24)及更高版本的应用程序不接收 CONNECTIVITY_ACTION 广播,如果他们声明广播接收器 在他们的清单中。应用仍会收到 CONNECTIVITY_ACTION 如果他们注册他们的 BroadcastReceiver 则广播 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....
    }
  };

0
投票

我有一个问题,我想刷新(强制刷新)因为

public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities)
不会迅速改变。

connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkRequest networkRequest = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
                .build();

        wifiBande1Infos = new JSONObject();
        wifiBande2Infos = new JSONObject();

        NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
                    @Override
                    public void onAvailable(Network network) {

                    }


                    @Override
                    public void onLost(Network network) {

                    }

                    @Override
                    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                    }

                    @Override
                    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                        super.onCapabilitiesChanged(network, networkCapabilities);
                        executor.execute(() -> {

                            Network activeNetwork = connectivityManager.getActiveNetwork();
                            LinkProperties linkProperties = connectivityManager.getLinkProperties(activeNetwork);

                            linkProperties = connectivityManager.getLinkProperties(network);
                            interfaceName = linkProperties.getInterfaceName();

                            WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();

                            if (wifiInfo != null) {
                                String ssid = wifiInfo.getSSID();

                                try {

                                    if (interfaceName.equals("wlan0")) {

                                        JSONObject ssidEntry = new JSONObject();
                                        ssidEntry.put("getRssi", String.valueOf(wifiInfo.getRssi()));
                                        ssidEntry.put("getRssi2", String.valueOf(networkCapabilities.getSignalStrength()));
                                        
                                        JSONArray ssidEntryArray = new JSONArray();
                                        ssidEntryArray.put(ssidEntry);

                                        wifiBande1Infos.put(interfaceName, ssidEntryArray);
                                    } else if (interfaceName.equals("wlan1")) {

                                        
                                        JSONObject ssidEntry = new JSONObject();
                                        
                                        ssidEntry.put("getRssi", String.valueOf(wifiInfo.getRssi()));
                                        ssidEntry.put("getRssi2", String.valueOf(networkCapabilities.getSignalStrength()));
                                        
                                        JSONArray ssidEntryArray = new JSONArray();
                                        ssidEntryArray.put(ssidEntry);

                                        wifiBande2Infos.put(interfaceName, ssidEntryArray);
                                    }

                                    refreshInfosWifi();

                                } catch (JSONException e) {
                                    Log.e(TAG, "Error Connection 152", e);
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                };


        connectivityManager.registerNetworkCallback(networkRequest, networkCallback); 
        connectivityManager.requestNetwork(networkRequest, networkCallback); 


scheduler = Executors.newScheduledThreadPool(1);
    scheduler.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {

            try {
                updateRSSI();
            } catch (JSONException e) {
                throw new RuntimeException(e);
            }

        }
    }, 0, 1, TimeUnit.SECONDS);



 private void updateRSSI() throws JSONException {

    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int wlan0_rssi_old = wifiInfo.getRssi();

    //Log.d(TAG, "Refresh 2s : Rssi Wlan0 OLD : "+wlan0_rssi_old);

    if(!wifiBande1Infos.isNull("wlan0")) {
        JSONArray wifiBande1InfosArray = wifiBande1Infos.getJSONArray("wlan0");
        JSONObject wifiBande1InfosObj = wifiBande1InfosArray.getJSONObject(0);
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities((Network) wifiBande1InfosObj.get("IdNetworkMaster"));
        WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();

       

    }
    if(!wifiBande2Infos.isNull("wlan1")) {
        JSONArray wifiBande2InfosArray = wifiBande2Infos.getJSONArray("wlan1");
        JSONObject wifiBande2InfosObj = wifiBande2InfosArray.getJSONObject(0);
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities((Network) wifiBande2InfosObj.get("IdNetworkMaster"));
        WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();

      

    }


    runOnUiThread(new Runnable() {
                      @Override
                      public void run() {
                          TextView T_wifiRSSI_old_txt = findViewById(R.id.wifiRSSI_old_txt);
                          T_wifiRSSI_old_txt.setText(String.valueOf(wlan0_rssi_old)+" dBm");
                          ProgressBar P_wifiRSSI_old = findViewById(R.id.wifiRSSI_old);
                          P_wifiRSSI_old.setProgress(Integer.parseInt(String.valueOf(wlan0_rssi_old)));

                      }
                  });
}

正如你在上面看到的,我使用的是最新的 API >=33,反正我的应用程序只能在 33 下运行。

目标是比较 RSSI 刷新:

  • 旧方法:
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
  • 新方法:
    WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();

我看到强制刷新在旧方法上效果很好。 另一方面,根据新闻,我既不能更新 onCapabilitiesChanged,也不能自己获取值。

我一定做错了,你能纠正我的错误吗?

我添加到这个新方法的一个非常奇怪的效果,低于 -50 dBm 2 个 wlans 不再更新。另一方面,旧方法适用于 -1dbm。除非有可能通过新方法实际强制刷新。

预先感谢任何可以帮助我的人,我已经研究了好几天了...:)

© www.soinside.com 2019 - 2024. All rights reserved.