3

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

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

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

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

isConnected();
isAvailable();

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

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

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

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

谢谢

4

3 回答 3

2

检查意图互联网连接

<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");
     }
   }
}
于 2012-06-08T12:36:43.207 回答
1

这是我使用的方法:

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

以下是该方法的使用方法:

if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}
于 2013-04-20T20:37:10.103 回答
0

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

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

用法:

ConnectivityReporter(context)
        .statesStream()
        .subscribe(
            { connected -> Timber.d("connectivity state: $connected") },
            { err -> Timber.d(err, "error") }
        )
于 2018-12-04T16:49:54.393 回答