【问题标题】:ConnectivityManager.NetworkCallback is not workig as requiredConnectivityManager.NetworkCallback 没有按要求工作
【发布时间】:2020-04-14 10:27:20
【问题描述】:

我使用ConnectivityManager.NetworkCallback 为安卓设备获取连接的 wifi 网络 SSID。我需要为 Android 9.0 及更高版本实现此应用程序。因此我没有使用广播接收器(因为它们已被 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);

这在我打开和关闭 wifi 连接时有效。但是,如果我将连接从一个网络更改为其他网络,这些 Toast 将无法正常工作。那我该怎么办呢?

【问题讨论】:

  • 换网时,这个检查if (connectedSsid != null)是否通过?
  • 没有。是不是不行。

标签: android android-wifi android-connectivitymanager


【解决方案1】:

使用此代码,也许它会对您有所帮助。

 public boolean isConnectingToInternet() {
    ConnectivityManager connectivity = (ConnectivityManager) MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null)
            for (int i = 0; i < info.length; i++)
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }

    }
    return false;
}

在 OnCreate() 中添加编写此代码

 if (!isConnectingToInternet()) {
        LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
        View view1 = inflater.inflate(R.layout.internet_error, null);
        final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
                .setView(view1).create();
        Button cancel = view1.findViewById(R.id.btn_cancel);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
            }
        });
        Toast.makeText(this, "Not Connected To Internet..", Toast.LENGTH_SHORT).show();
        alertDialog.show();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多