[英]Android: Check network and real internet connectivity
以下是一段Android代碼,可以很好地檢查網絡是否已連接。
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
但是擁有活動的網絡接口並不能保證特定的網絡服務可用。
我們已經連接到網絡,但是仍然無法訪問普通的互聯網網絡服務,例如Google
常見情況:
一種方法是檢查“ isNetworkAvailable”函數是否返回TRUE,然后運行以下代碼
HttpGet request = new HttpGet(url));
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 60000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
request.addHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
result = EntityUtils.toString(entity);
}
}
catch (SocketException e)
{
return "Socket Exceptiopn:" + e.toString();
}
catch (Exception e)
{
return "General Execption:" + e.toString();
}
但是我認為這不是一個好方法,因為它可能會花費很多時間
那么,是否有任何其他有效的方式(就所花費的時間,速度而言)可確保我們連接到網絡並可以訪問大多數常見的Internet服務?
檢查此代碼...對我有用:)
public static void isNetworkAvailable(final Handler handler, final int timeout) {
// ask fo message '0' (not connected) or '1' (connected) on 'handler'
// the answer must be send before before within the 'timeout' (in milliseconds)
new Thread() {
private boolean responded = false;
@Override
public void run() {
// set 'responded' to TRUE if is able to connect with google mobile (responds fast)
new Thread() {
@Override
public void run() {
HttpGet requestForTest = new HttpGet("http://m.google.com");
try {
new DefaultHttpClient().execute(requestForTest); // can last...
responded = true;
} catch (Exception e) {}
}
}.start();
try {
int waited = 0;
while(!responded && (waited < timeout)) {
sleep(100);
if(!responded ) {
waited += 100;
}
}
}
catch(InterruptedException e) {} // do nothing
finally {
if (!responded) { handler.sendEmptyMessage(0); }
else { handler.sendEmptyMessage(1); }
}
}
}.start();
}
然后,定義處理程序:
Handler h = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what != 1) { // code if not connected
} else { // code if connected
}
}
};
並啟動測試:
isNetworkAvailable(h,2000); // get the answser within 2000 ms
來自Gilbou的代碼https://stackoverflow.com/a/5803489/2603719
希望我能幫到你
問題1:
連接到Wi-Fi(實際上是專用網絡)的Android設備。
所以isNetworkAvailable
將返回該網絡已連接,但無法連接到任何其他服務。
問題2:
有時電話信號顯示它已連接到服務提供商的數據計划。 因此網絡連接為true,但仍無法訪問google / yahoo。
I'm not sure about Issue #1 but I'm sure that following approach will solve Issue #2.
最終,您將需要監視網絡連接的變化,
第1步:
只需注冊一個BroadcastReceiver
進行以下操作
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
第2步:
當您在onReceive(Context context,Intent intent)
方法上獲得回調時,請檢查連接狀態。
即: boolean isConnected = getIntent().getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY);
//除了EXTRA_NO_CONNECTIVITY
,還有其他一些參數對於監視
參考:
例子:
步驟1,步驟2的工作示例:如何在Android中監控網絡連接
Android文件:
我希望這會有所幫助!
使用此代碼檢查Internet連接,它檢查設備上的所有Internet連接。 並確保您已在清單中添加了Internet權限。
boolean flag=false;
ConnectivityManager connectivity = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
flag=true;
}
}
if(flag==true)
{
Log.e("TAG","Internet Is Connected");
}
else
{
Log.e("TAG","Internet Is Not Connected");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.