Android究竟如何確定以下狀態之間的差異?Android究竟如何確定它是否在線?
網絡接口有效(例如Wifi或3G),但無法訪問互聯網。
網絡接口處於活動狀態,需要請求用戶登錄到網頁上的網絡。
有一個網絡接口激活並能夠訪問互聯網。
它可能會發送一個簡單的HTTP請求到一個固定的URL(也許在google.com上?)並檢查返回的文檔是否符合要求?如果是這樣,我們是否知道使用的網址?
Android究竟如何確定以下狀態之間的差異?Android究竟如何確定它是否在線?
網絡接口有效(例如Wifi或3G),但無法訪問互聯網。
網絡接口處於活動狀態,需要請求用戶登錄到網頁上的網絡。
有一個網絡接口激活並能夠訪問互聯網。
它可能會發送一個簡單的HTTP請求到一個固定的URL(也許在google.com上?)並檢查返回的文檔是否符合要求?如果是這樣,我們是否知道使用的網址?
是的,你也可以發送ping :)
你應該在小型網絡中的Util類使用的操作順序是: - 檢查接口在線 - 檢查其是否能打開一個套接字到google.com或ping google.com
試試這個:
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null);
}
UPDATE:更新的代碼,以避免NetworkOnMainThreadException
我目前使用下面的方法來確定設備是否可以訪問互聯網或不:
public class NetworkConnectivityHelper {
public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){
new Thread(new Runnable() {
@Override
public void run() {
boolean isDeviceConnectedToInternet = false;
NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){
try {
InetAddress.getByName("google.com").isReachable(2);
isDeviceConnectedToInternet = true;
} catch (UnknownHostException e){
isDeviceConnectedToInternet = false;
} catch (IOException e){
isDeviceConnectedToInternet = false;
}
}
final boolean result = isDeviceConnectedToInternet;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
callback.done(result);
}
});
}
}).start();
}
public static abstract class ResultCallback{
public abstract void done(boolean connected);
}
}
稱這種由:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
//Populate
NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper();
networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() {
@Override
public void done(boolean connected) {
if (connected) {
//Yey, the device is connected.
//Now, do some work
}else{
//The device is disconnected
}
}
});
....
}
希望這有助於!
這將強制在更高版本的android上使用主線程上的網絡連接。另外,在我測試過的無線網絡上需要登錄,這個測試仍然返回,因爲它不應該連接。 – schwiz