ConnectivityManager.NetworkCallback не работает как требуется - PullRequest
0 голосов
/ 23 декабря 2019

Я использовал ConnectivityManager.NetworkCallback, чтобы взять SSID подключенной сети Wi-Fi для устройств Android. Мне нужно реализовать это приложение для Android 9.0 и выше. Поэтому я не использовал Broadcast Receivers (потому что они устарели до Android 9.0). Вместо этого я использовал ConnectivityManager.NetworkCallback. следующим образом.

    package com.example.myapplication;

    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.Network;
    import android.net.NetworkRequest;
    import android.net.wifi.WifiConfiguration;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.widget.Toast;

    import androidx.annotation.RequiresApi;
    import androidx.appcompat.app.AppCompatActivity;

    import java.util.List;

    public class MainActivity extends AppCompatActivity {
        ConnectivityManager connectivityManager;
        ConnectivityManager.NetworkCallback networkCallback;

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkRequest networkRequest = new NetworkRequest.Builder().build();

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

                    WifiManager wifiManager;
                    String connectedSsid = null;
                    wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
                    WifiInfo info = wifiManager.getConnectionInfo();
                    connectedSsid = info.getSSID();
                    if (connectedSsid != null) {
                        Toast.makeText(getApplicationContext(), "*******" + connectedSsid + "**********", Toast.LENGTH_LONG).show();
                    }
                }

                @Override
                public void onLost(Network network){
                    Toast.makeText(getApplicationContext(), "*******DIS!! connected**********", Toast.LENGTH_LONG).show();
                }
            };
            connectivityManager.registerNetworkCallback(networkRequest,networkCallback);
        }

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onStop(){
            super.onStop();
            connectivityManager.unregisterNetworkCallback(networkCallback);
        }
    }

Я добавил необходимые разрешения в AndroidManifest следующим образом,

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

Я зарегистрировал это в методе onCreate как,

connectivityManager.registerNetworkCallback(networkRequest,networkCallback);

и незарегистрированный в методе onStop как,

connectivityManager.unregisterNetworkCallback(networkCallback);

Это работает, когда я включаю и выключаю соединение Wi-Fi. Но если я переключаю соединение из одной сети в другую, эти тосты не работают. Так что я должен сделать для этого?

...