[英]Android: Network connectivity check always fail
在我的應用程序中,有一個具有天氣活動的模塊。 當用戶單擊並激活天氣功能時,將檢查網絡連接。 問題是,直接啟動后,我的吐司消息“無網絡連接”隨Android對話框一起啟用。
當用戶單擊“啟用”時,選項中沒有任何要激活的內容(所有功能均處於啟用狀態)。 當用戶單擊“取消”時,對話框消失,應用程序正在運行。
這是我從活動中獲得的代碼:
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
@Override
public void onStart() {
super.onStart();
EasyTracker.getInstance(this).activityStart(this);
// Connect the client.
mLocationClient.connect();
// Registers BroadcastReceiver to track network connection changes.
mNetworkReceiver = new NetworkReceiver() {
private MyAlertDialog enableNetworkDialog = null;
@Override
public void onNoConnectivity() {
Toast.makeText(MainActivity.this,
getString(R.string.network_disabled), Toast.LENGTH_LONG)
.show();
// If the dialog already prompted, do nothing
if (enableNetworkDialog != null
&& enableNetworkDialog.isShowing())
return;
// Prompt a dialog for user to open the network settings screen
enableNetworkDialog = new MyAlertDialog(MainActivity.this,
null, getString(R.string.network_disabled), false);
enableNetworkDialog.setPositiveButton("Enable",
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
toggleNetworkSourceSetting();
}
});
enableNetworkDialog.setNegativeButton("Cancel",
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
});
enableNetworkDialog.show();
}
@Override
public void onConnect() {
if (enableNetworkDialog != null
&& enableNetworkDialog.isShowing())
enableNetworkDialog.dismiss();
}
@Override
public void onNetworkChange() {
}
@Override
public void onReconnect() {
}
};
}
更新:這是我的清單:
<!-- Grant the network access permission -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
這是我的logcat的摳圖:
[ 07-19 10:43:17.876 18037:18037 D/ ]
Current Network Info : NetworkInfo: type: mobile_supl[HSPA+, type_ext: mobile_supl], state: DISCONNECTED/DISCONNECTED, reason: dataDisabled, extra: internet.telekom, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false, isIpv4Connected: false, isIpv6Connected: false
[ 07-19 10:43:17.876 18037:18037 D/ ]
No network is available
07-19 10:43:19.778 18037-18037/bakteriusdeveloper.master D/Network Connection: mobile is available
更新超級方法:
/**
* The subclass of the BroadcastReeiver is used to detect the change of
* connectivity.
*
*/
public class NetworkReceiver extends BroadcastReceiver {
public NetworkReceiver() {
super();
}
public void onNoConnectivity() {
};
public void onNetworkChange() {
};
public void onConnect() {
};
public void onReconnect() {
};
public void toggleNetworkSourceSetting() {
startActivity(new Intent(
android.provider.Settings.ACTION_WIRELESS_SETTINGS));
}
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager conn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activNetworkInfo = conn.getActiveNetworkInfo();
String failMessage = intent
.getStringExtra(ConnectivityManager.EXTRA_REASON);
Logger.printMessage(getClass().getSimpleName(), failMessage,
Logger.DEBUG);
Boolean isNoConnectivity = intent.getBooleanExtra(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
Boolean isFailOver = intent.getBooleanExtra(
ConnectivityManager.EXTRA_IS_FAILOVER, false);
Logger.printMessage(getClass().getSimpleName(), "is Failover: "
+ isFailOver, Logger.DEBUG);
Boolean isNetworkChanged = false;
NetworkInfo otherNetworkInfo = (NetworkInfo) intent
.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
NetworkInfo networkInfo = (NetworkInfo) intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Logger.printMessage(getClass().getSimpleName(),
"Current Network Info : " + networkInfo, Logger.DEBUG);
Logger.printMessage(getClass().getSimpleName(),
"Other Network Info : " + otherNetworkInfo, Logger.DEBUG);
if (networkInfo != null && networkInfo.isConnected()) {
if (isFailOver) {
Logger.printMessage(getClass().getSimpleName(),
"Network is re-connected and available now",
Logger.DEBUG);
onReconnect();
return;
} else {
Logger.printMessage(getClass().getSimpleName(),
"Network is available", Logger.DEBUG);
onConnect();
return;
}
} else if (networkInfo != null
&& !networkInfo.isConnectedOrConnecting()) {
// do application-specific task(s) based on the current network
// state, such
// as enabling queuing of HTTP requests when currentNetworkInfo
// is connected etc.
if (otherNetworkInfo != null
&& otherNetworkInfo.isConnectedOrConnecting()) {
isNetworkChanged = true;
} else {
Logger.printMessage(getClass().getSimpleName(),
"No network is available", Logger.DEBUG);
onNoConnectivity();
return;
}
}
// No network is active OR no network is available
if (activNetworkInfo == null || isNoConnectivity) {
if (isNetworkChanged) {
Logger.printMessage(getClass().getSimpleName(),
"Change network connectivity", Logger.DEBUG);
onNetworkChange();
return;
} else {
Logger.printMessage(getClass().getSimpleName(),
"No network is available", Logger.DEBUG);
onNoConnectivity();
return;
}
}
}
}
我的要求出了什么問題? 有任何想法嗎?
您可以在onResume而不是onStart中注冊NetworkReceiver並檢查其是否有效
確保在AndroidManifest.xml中添加了網絡權限:
<uses-permission android:name="android.permission.INTERNET" />
在清單中注冊一個廣播接收器:
<receiver
android:name=".NetworkReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
然后是NetworkReceiver類:
public class NetworkReceiver extends BroadcastReceiver {
private static volatile boolean connected;
@Override
public void onReceive(final Context context, final Intent intent) {
Log.d("Network", "Network changed");
if (intent.getExtras() != null) {
update();
}
}
public static void update() {
ConnectivityManager connectivityManager = (ConnectivityManager) ApplicationLoader
.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
connected = networkInfo != null && networkInfo.isConnected();
}
public static boolean isConnected() {
return connected;
}
}
然后,如果您要檢查網絡狀態調用:
NetworkReceiver.update(); // Updates network status
if (NetworkReceiver.isConnected()) {
// do whatever you want.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.