【问题标题】:Android, check internet connectivityAndroid,检查互联网连接
【发布时间】:2012-06-12 12:21:21
【问题描述】:

我已经进行了很好的搜索并尝试了我看到的各种答案,但它们似乎都不适用于我的情况。我正在寻找一个强大的解决方案,所以,事不宜迟;

我有一个不寻常的情况,我的应用需要连接到没有互联网连接的 wifi 网络来执行某些任务(本地网络),一旦完成,它需要断开连接并重新连接到备用网络,可以是移动设备,也可以是具有互联网连接的替代 wifi 热点,以便我可以进行通讯。

我遇到的问题是,我的通讯队列需要确保它在即将开始通讯时确实有一条通往互联网的路由(在连接更改时触发)

我在 ConnectivityManager 上尝试过各种调用,例如:

isConnected();
isAvailable();

但即使连接到我的非互联网网络,这些也会返回 true。

我需要一种方法来确保在连接到我的非 Internet 网络(或任何其他非 Internet 网络,例如 BT Openzone,例如,在未注册和登录时)我可以被告知有is not route to the internet,然后当我确实有路由时,我可以返回一个 true。

我考虑的一种可能性是 ping,但如果可能的话,我更喜欢更整洁的东西。

我尝试了 requestRouteToHost() 但这并没有达到我的预期,实际上我试图改变连接,这不是我想要的。

谢谢

【问题讨论】:

    标签: android android-wifi connectivity


    【解决方案1】:

    来自Check INTENT internet connection

    <receiver android:name=".YOURRECEIVER">
       <intent-filter>
          <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
       </intent-filter>
    </receiver>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    
    public class NetworkStateReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
         super.onReceive(context, intent);
         Log.d("app","Network connectivity change");
         if(intent.getExtras()!=null) {
            NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
            if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
                Log.i("app","Network "+ni.getTypeName()+" connected");
            }
         }
         if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
                XLog.d("app","There's no network connectivity");
         }
       }
    }
    

    【讨论】:

    • 我不相信这种方法与我最初使用的方法有什么不同。它报告并正确地表明存在活动连接,但没有表明存在到远程主机的路由。
    【解决方案2】:

    这是我使用的方法:

    public static boolean isNetworkAvailable(final Context context)  {
        return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
    }
    

    这里是如何使用该方法:

    if (isNetworkAvailable(context)) {
        // code here
    } else {
        // code
    }
    

    【讨论】:

    • 这是否适用于没有连接的活动连接?我的问题现在已经很老了,但我想接受一个答案。我当时发现没有真正的解决方案(API 方面)不需要 ping 远程主机或类似的。
    • 这会检测用户是否可以访问互联网。我在所有应用程序中都使用它。
    • 这不适用于没有互联网的 wifi。如果第一个查询失败(例如 ping 8.8.8.8),您应该仔细检查该值
    【解决方案3】:

    https://gist.github.com/allco/d50fc10f523293d22fc3d85efe4aaff2

    这是我的 Rx 版本的 ConnectivityReporter。它使用不同的 API 级别 >=24 和 任何网络的连接。例如,如果有没有互联网的 wifi,它会报告 true 但没关系,因为对于大多数用户来说这已经足够了,否则检查可能会非常复杂,因为术语 online 具有相当广泛的含义。

    用法:

    ConnectivityReporter(context)
            .statesStream()
            .subscribe(
                { connected -> Timber.d("connectivity state: $connected") },
                { err -> Timber.d(err, "error") }
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 2017-11-30
      • 2012-02-21
      • 2013-02-02
      • 2011-02-14
      • 2012-03-23
      • 1970-01-01
      • 2016-01-16
      相关资源
      最近更新 更多