2017-02-28 45 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

相關問題