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

标签 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 网络发送我的数据,所以我m 无法连接到本地地址。

现在我在发送数据之前检查 Activity 网络如下:

private boolean isActiveNetworkWifi() {

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

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

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

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

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

但是我该如何使用 Retrofit Controller 呢?

最佳答案

这不是 Retrofit 问题,而是自 Lollipop 以来 Android 的“智能”,它管理您使用启用 Internet 的连接而不是空连接的请求。为了管理这个问题,您需要明确地将连接绑定(bind)到特定的网络类型。我不知道如何使用 Retrofit 解决它(我有同样的问题,但在套接字级别),但这里有一篇文章可以让您更深入地了解如何解决它 Connecting your App to a Wi-Fi Device

关于android - Retrofit 通过移动服务连接,因为 Wi-Fi 网络没有互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513921/

相关文章:

android - 如何找到被点击的地方或路径 VectorDrawable

broadcastreceiver - 应用安装后删除 Apk

java - 如何使用 Retrofit 解析嵌套 json?

android - Retrofit 中从 AsyncTask 到 Coroutines 的转换 : IllegalArgumentException

android - 避免改造 POJO 冗余

android - 如何使 View 在触摸事件时可调整大小

android - 使用 build.gradle 文件将 Eclipse 项目导入 Android Studio 失败

android - 为什么我应该使用 OkHttp 而不是 android httpClient 和 AsyncTask

java - 如何通过改造从 api 获取照片引用

android - Retrofit 2 在 minifyenable 时在发布 APK 中返回 null 但在调试 APK 中正常