android - Broadcastreceiver检测网络是否连接

标签 android

我试图让用户连接到网络的那一刻,然后我认为 BroadcastReceiver 是一个好方法......我想做的是,当用户连接时知道该网络是否连接到 Internet。

最主要的是知道 WiFi 是否需要 Browse Log in 示例:Handling Network Sign-On文档

到目前为止我尝试过什么?

我已经把我的 BroadcastReceiver 改成了这个

if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
    Log.d("Network", "Internet YAY");
} else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
    if (isNetworkOnline()) {
        Log.d(TAG, String.valueOf(tikis));
        NetTask TeInternet = new NetTask();
        TeInternet.execute("https://www.google.com");


    }
}

问题是,当我尝试在没有 Internet 连接 的情况下连接到 WiFi 时,输入是这样的:

D/Network﹕ Internet YAY
D/Network﹕ Internet YAY
D/Network﹕ Internet YAY
D/RequiresLoginBroadcast﹕ 1 //this occurs sometimes

我已根据 Handling Network Sign-OnInner Class 更改为此文档

doInBackground() 方法:

protected Boolean doInBackground(String...params) {
boolean internetAccessExists = false;
String urlToBeAccessed = params[0];
final int TIMEOUT_VALUE_IN_MILLISECONDS = 15000;
URL url;
HttpURLConnection urlConnection = null;
try {
    url = new URL(urlToBeAccessed);
    urlConnection = (HttpURLConnection) url.openConnection();
    //set the respective timeouts for the connection
    urlConnection.setConnectTimeout(TIMEOUT_VALUE_IN_MILLISECONDS);
    urlConnection.setReadTimeout(TIMEOUT_VALUE_IN_MILLISECONDS);
    //the redirect check is valid only after the response headers have been received
    //this is triggered by the getInputStream() method
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    if (!url.getHost().equals(urlConnection.getURL().getHost())) {
        internetAccessExists = true;
    }
}
//any sort of exception is considered as a redirect.
//more specific exceptions such as SocketTimeOutException and IOException can be handled as well
catch (Exception e) {
    Log.d(TAG, e.toString());
} finally {
    Log.d(TAG, "Finally");
    urlConnection.disconnect();
}
return internetAccessExists;

到目前为止我一直在寻找什么?

  1. How to detect when WIFI Connection has been established in Android?
  2. Android WIFI How To Detect When Specific WIFI Connection is Available
  3. BroadcastReceiver is not working (detect if wifi is connected)

还有更多......但遗憾的是我没有找到正确的答案。

TL;DR

我正在尝试做的事情是获取用户连接到网络的确切事件,然后找到一个很好的方法来检测我是否可以进行 google ping 或检查是否有连接到 Internet (仅限 WIFI,不允许 3G 连接),因为我现在使用的代码有时会失败...

我认为这是了解是否存在 Internet 连接 的好方法,因为我想知道的是检测 Wifi 是否需要浏览器登录。

我们差不多完成了...但我不明白为什么在 BroadcastReceiver 上输入 4 次甚至 5 次...。有时说有 Internet 连接 没有的时候...

最佳答案

这是我目前正在使用的,并且运行良好。我会在互联网连接时收到通知(不仅仅是打开,而是在实际连接到互联网时)。
它也适用于任何类型的数据连接,但可以轻松修改为仅接受 WiFi、3G、4G 等。

代码:

public class NetworkReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
                Log.d("Network", "Internet YAY");
            } else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
                Log.d("Network", "No internet :(");
            }
        }
    }
}

list :

<receiver
    android:name=".receivers.NetworkReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

关于android - Broadcastreceiver检测网络是否连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689513/

相关文章:

android - 首次尝试运行和加载模拟器时 Android Studio 中的错误消息

java - 滚动时Android ListView项目消失

android - 无法使用 LiveParse 查询合并 dex

android - 在 Android 应用程序中单击选项卡时打开新类时出错

android - 我如何教 ProGuard 摆脱它保留的我不使用的东西?

java - 如何将RSA私钥存储到后端给出的应用程序中?

android - 如何将XML中的字符串数组和整数数组添加到一个集合中

java - 解析android/java文件中的Json数组

android - 在列表中看不到 genymotion 虚拟设备

android - 带有自定义 ArrayAdapter 的 ListView 不显示项目