2017-02-28 88 views
0

我有一个应用程序必须通过Wi-Fi连接到某些设备并向其发送一些数据(本地地址192.168.4.1)。改装通过移动服务连接,因为Wi-Fi网络没有互联网连接

我为此有些控制器类:

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)仅连接到无线网络和移动服务是关闭所有去好:数据被发送如预测的那样到设备。但问题是,该设备没有互联网连接,所以如果我的手机有移动服务,Android会选择该网络作为主要网络,并且Retrofit会尝试通过该服务发送我的数据,而不是Wi-Fi网络,无法连接到本地地址。

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

private boolean isActiveNetworkWifi() { 

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

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

如果主动网络不ConnectivityManager.TYPE_WIFI我简单地要求用户关闭移动服务。

我知道,与棒棒堂开始,你有一个选项,以某种方式注册您的网络电话与移动服务一起使用,例如不能上网的Wi-Fi网络:

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

但我该如何使用,在条件使用Retrofit控制器?

回答

1

这不是一个翻新问题,但是由于Lollipop管理您使用支持Internet的连接的请求而不是空的,所以Android的“智能”。为了管理此问题,您需要将连接显式绑定到特定的网络类型。我不知道如何用Retrofit解决它(我有同样的问题,但在套接字级别),但这里是一篇文章,可以给你更多的见解如何解决它Connecting your App to a Wi-Fi Device