改造通过移动服务连接,因为Wi-Fi网络没有互联网连接

时间:2017-02-28 16:25:02

标签: android retrofit retrofit2 android-networking

我有一个应用必须通过Wi-Fi连接到某个设备并向其发送一些数据(本地地址192.168.4.1)。

我有一些用于此目的的Controller类:

public class Controller {

private CallbackListener mListener;
private RestApiManager mApiManager;

public Controller(CallbackListener listener) {
    mApiManager = new RestApiManager();
    mListener = listener;
}

public void sendSomeData(String data) {

    SomeRestApi api = mApiManager.getSomeApi();

    api.sendDataToDevice(data, new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            mListener.onSuccess(s);
        }

        @Override
        public void failure(RetrofitError error) {
            mListener.onFailure(error);
        }
    });
}

public interface CallbackListener {
    void onSuccess(String response);
    void onFailure(RetrofitError error);
}

如果我的智能手机(Android M 6.0.1)仅连接到该Wi-Fi并且移动服务已关闭,则一切正常:数据正在按预期发送到设备。但问题是,该设备没有互联网连接,所以如果我的手机上有移动服务,Android会选择该网络作为主要网络,而Retrofit会尝试通过该服务发送我的数据,而不是wi-fi网络,所以我无法连接到本地地址。

现在我在发送数据之前检查Active Network,如下所示:

private boolean isActiveNetworkWifi() {

        ConnectivityManager connectivityManager
                = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();

        return activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

如果有效网络不是ConnectivityManager.TYPE_WIFI,我只是要求用户关闭移动服务。

我知道从Lollipop开始,您可以选择以某种方式注册您的网络电话以使用此类无网络Wi-Fi网络以及移动服务:

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

但是如何在使用Retrofit控制器方面使用它?

1 个答案:

答案 0 :(得分:1)

这不是一个改造问题,但&#34;智能&#34; Android自Lollipop以来管理您使用启用Internet的连接的请求而不是空的连接。为了管理此问题,您需要显式绑定到特定网络类型的连接。我不知道如何使用Retrofit来解决它(我有同样的问题,但是在Socket级别上),但这篇文章可以为您提供更多有关如何解决它的见解Connecting your App to a Wi-Fi Device