2013-04-02 34 views
6

我想設置一個測試,以查看我的代碼在沒有互聯網訪問時是否正常工作。有沒有辦法暫時關閉互聯網訪問測試?暫時禁用android中的互聯網訪問?

我試過環顧四周,但找不到它。

由於提前, 優雅

+0

你想要做的代碼?或者只是手動在設備上禁用它? –

+0

在代碼理想情況下,我想能夠將其納入JUnit測試。 – Classtronaut

回答

4

此代碼示例應該爲Android手機運行工作薑餅和更高:此啓用/禁用數據連接

private void setMobileDataEnabled(Context context, boolean enabled) { 
    final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    final Class conmanClass = Class.forName(conman.getClass().getName()); 
    final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); 
    iConnectivityManagerField.setAccessible(true); 
    final Object iConnectivityManager = iConnectivityManagerField.get(conman); 
    final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); 
    final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); 
    setMobileDataEnabledMethod.setAccessible(true); 
    setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled); 
} 

不要忘了此行添加到您的清單文件

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 

另外, 我知道啓用或禁用wifi:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(status); 

其中狀態根據需求可能爲真或假。

此外,在清單:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
+0

謝謝你,這正是我所追求的。:) – Classtronaut

+0

比接受答案是一個好主意。 – JacksOnF1re

+0

它不適合我。我得到這個錯誤'java.lang.NoSuchMethodException:setMobileDataEnabled [boolean]'。設備:Nexus 5x,Android版本:7.1.1 –

2

好了,停用WiFi,您可以使用此代碼:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(true); // "true" TO ENABLE || "false" TO DISABLE 

要禁用數據連接,您可以在這裏使用解決方案:https://stackoverflow.com/a/4304110/450534。但是這種方法,確實在2.3+

在這裏工作這個答案有兩個2.3 + 2.2及以下解決方案:https://stackoverflow.com/a/12535246/450534。你可以做一個簡單的API檢查並決定運行哪一段代碼。像這樣的東西應該讓你成立:

int currentAPIVersion = android.os.Build.VERSION.SDK_INT; 
if (currentAPIVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { 
    // RUN THE CODE FOR 2.3+ 
} else { 
    // RUN THE CODE FOR API LEVEL BELOW 2.3 
} 

看看這兩個作品中的哪一個適合你。我懷疑,這將是後者。儘管如此,我個人從未嘗試過測試啓用或禁用數據連接。

支持鏈接解決方案的作者。 ;-)

注意:數據連接解決方​​案基於非官方API,可能在未來的版本中無法使用。