为什么我的设备在连接到WIFI时似乎没有连接到互联网?
问题描述:
这个SSCCE应用程序的想法是,当MainActivity被创建(即在onCreate())期间,我们检查设备是否连接到互联网。如果不是,则显示AlertDialog
说"Please check your internet connection"
。为什么我的设备在连接到WIFI时似乎没有连接到互联网?
在此if
块中,存在一个while循环,它在互联网连接重新获得时执行。
问题是,即使当我的模拟器连接到主机连接到的无线网络,我的手机也连接到无线网络(我也在真实手机上测试过)时,它始终显示对话框。问题是为什么,我该如何解决这个问题。
的另一个问题是,一些奇怪的例外是在logcat中提出的,它ddoes注销信息"THE NETWORK IS NOW AVAILABLE"
检查(见代码,看看这张支票是什么)的
有关部分SSCCE
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate of MainActivity called.");//check
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.mainActivity_textView);
if (!hasInternetAccess(this)) {
InternetDisconnectedDialogFragment internetDisconnectedDialogFragment = new InternetDisconnectedDialogFragment();
internetDisconnectedDialogFragment.show(getSupportFragmentManager(),
"practice_projects.minimal_alert_dialog.InternetDisconnectedDialogFragment");
while (hasInternetAccess(this)) {
Log.i(TAG, "Checking internet connection...");
textView.setBackgroundColor(Color.parseColor("#FACC2E"));
internetDisconnectedDialogFragment.dismiss();
}
}
}
public static boolean hasInternetAccess(Context context) {
Log.i(TAG, "hasInternetAccess of MainActivity called.");//check
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://google.com").openConnection());
//HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);
} catch (IOException e) {
Log.e(TAG, "Error checking internet connection", e);
}
Log.i(TAG, "THE NETWORK IS NOW AVAILABLE");
} else {
Log.d(TAG, "No network available!");
}
return false;
}
private static boolean isNetworkAvailable(Context context) {
Log.i(TAG, "isNetworkAvailable of MainActivity called.");//check
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
}
InternetConnectedDialogFragment.java
public class InternetDisconnectedDialogFragment extends DialogFragment{
private static final String TAG = InternetDisconnectedDialogFragment.class.getSimpleName();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.i(TAG, "onCreateDialog of InternetDisconnectedDialogFragment called.");//check
//Builder class is used for "convenient" dialog construction.
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
alertDialogBuilder.setMessage(R.string.internetDisconnectedDialogMessage);
alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, "onClick of an anonymous class in InternetDisconnectedDialogFragment called.");//check
InternetDisconnectedDialogFragment.this.dismiss();
}
});
return alertDialogBuilder.create();
}
}
logcat的
08-16 02:03:46.778: I/MainActivity(279): onCreate of MainActivity called.
08-16 02:03:46.824: I/MainActivity(279): hasInternetAccess of MainActivity called.
08-16 02:03:46.824: I/MainActivity(279): isNetworkAvailable of MainActivity called.
08-16 02:03:46.898: E/MainActivity(279): Error checking internet connection
08-16 02:03:46.898: E/MainActivity(279): java.net.SocketException: Permission denied
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
08-16 02:03:46.898: E/MainActivity(279): at java.net.Socket.checkClosedAndCreate(Socket.java:873)
08-16 02:03:46.898: E/MainActivity(279): at java.net.Socket.connect(Socket.java:1020)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
08-16 02:03:46.898: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.hasInternetAccess(MainActivity.java:50)
08-16 02:03:46.898: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.onCreate(MainActivity.java:29)
08-16 02:03:46.898: E/MainActivity(279): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-16 02:03:46.898: E/MainActivity(279): at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 02:03:46.898: E/MainActivity(279): at android.os.Looper.loop(Looper.java:123)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-16 02:03:46.898: E/MainActivity(279): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 02:03:46.898: E/MainActivity(279): at java.lang.reflect.Method.invoke(Method.java:521)
08-16 02:03:46.898: E/MainActivity(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-16 02:03:46.898: E/MainActivity(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-16 02:03:46.898: E/MainActivity(279): at dalvik.system.NativeStart.main(Native Method)
08-16 02:03:46.898: I/MainActivity(279): THE NETWORK IS NOW AVAILABLE
08-16 02:03:46.918: I/MainActivity(279): hasInternetAccess of MainActivity called.
08-16 02:03:46.918: I/MainActivity(279): isNetworkAvailable of MainActivity called.
08-16 02:03:46.978: E/MainActivity(279): Error checking internet connection
08-16 02:03:46.978: E/MainActivity(279): java.net.SocketException: Permission denied
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
08-16 02:03:46.978: E/MainActivity(279): at java.net.Socket.checkClosedAndCreate(Socket.java:873)
08-16 02:03:46.978: E/MainActivity(279): at java.net.Socket.connect(Socket.java:1020)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
08-16 02:03:46.978: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.hasInternetAccess(MainActivity.java:50)
08-16 02:03:46.978: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.onCreate(MainActivity.java:33)
08-16 02:03:46.978: E/MainActivity(279): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-16 02:03:46.978: E/MainActivity(279): at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 02:03:46.978: E/MainActivity(279): at android.os.Looper.loop(Looper.java:123)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-16 02:03:46.978: E/MainActivity(279): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 02:03:46.978: E/MainActivity(279): at java.lang.reflect.Method.invoke(Method.java:521)
08-16 02:03:46.978: E/MainActivity(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-16 02:03:46.978: E/MainActivity(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-16 02:03:46.978: E/MainActivity(279): at dalvik.system.NativeStart.main(Native Method)
08-16 02:03:46.978: I/MainActivity(279): THE NETWORK IS NOW AVAILABLE
08-16 02:03:46.978: I/InternetDisconnectedDialogFragment(279): onCreateDialog of InternetDisconnectedDialogFragment called.
08-16 02:03:47.028: I/dalvikvm(279): Could not find method android.view.Window$Callback.dispatchGenericMotionEvent, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.dispatchGenericMotionEvent
08-16 02:03:47.028: W/dalvikvm(279): VFY: unable to resolve interface method 13410: Landroid/view/Window$Callback;.dispatchGenericMotionEvent (Landroid/view/MotionEvent;)Z
08-16 02:03:47.028: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.038: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.dispatchGenericMotionEvent (Landroid/view/MotionEvent;)Z
08-16 02:03:47.038: I/dalvikvm(279): Could not find method android.view.Window$Callback.dispatchKeyShortcutEvent, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyShortcutEvent
08-16 02:03:47.038: W/dalvikvm(279): VFY: unable to resolve interface method 13412: Landroid/view/Window$Callback;.dispatchKeyShortcutEvent (Landroid/view/KeyEvent;)Z
08-16 02:03:47.038: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.048: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.dispatchKeyShortcutEvent (Landroid/view/KeyEvent;)Z
08-16 02:03:47.048: W/dalvikvm(279): VFY: unable to find class referenced in signature (Landroid/view/ActionMode;)
08-16 02:03:47.048: I/dalvikvm(279): Could not find method android.view.Window$Callback.onActionModeFinished, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onActionModeFinished
08-16 02:03:47.058: W/dalvikvm(279): VFY: unable to resolve interface method 13416: Landroid/view/Window$Callback;.onActionModeFinished (Landroid/view/ActionMode;)V
08-16 02:03:47.058: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.058: D/dalvikvm(279): VFY: dead code 0x0005-0005 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onActionModeFinished (Landroid/view/ActionMode;)V
08-16 02:03:47.068: W/dalvikvm(279): VFY: unable to find class referenced in signature (Landroid/view/ActionMode;)
08-16 02:03:47.068: I/dalvikvm(279): Could not find method android.view.Window$Callback.onActionModeStarted, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onActionModeStarted
08-16 02:03:47.068: W/dalvikvm(279): VFY: unable to resolve interface method 13417: Landroid/view/Window$Callback;.onActionModeStarted (Landroid/view/ActionMode;)V
08-16 02:03:47.068: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.079: D/dalvikvm(279): VFY: dead code 0x0005-0005 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onActionModeStarted (Landroid/view/ActionMode;)V
08-16 02:03:47.079: I/dalvikvm(279): Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode
08-16 02:03:47.079: W/dalvikvm(279): VFY: unable to resolve interface method 13430: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;
08-16 02:03:47.079: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.088: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;
08-16 02:03:47.108: I/AppCompatDelegate(279): The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's
08-16 02:03:47.208: I/dalvikvm(279): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
08-16 02:03:47.218: W/dalvikvm(279): VFY: unable to resolve virtual method 408: Landroid/content/res/TypedArray;.getChangingConfigurations()I
08-16 02:03:47.218: D/dalvikvm(279): VFY: replacing opcode 0x6e at 0x0002
08-16 02:03:47.218: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/widget/TintTypedArray;.getChangingConfigurations()I
08-16 02:03:47.228: I/dalvikvm(279): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
08-16 02:03:47.228: W/dalvikvm(279): VFY: unable to resolve virtual method 430: Landroid/content/res/TypedArray;.getType (I)I
08-16 02:03:47.228: D/dalvikvm(279): VFY: replacing opcode 0x6e at 0x0002
08-16 02:03:47.228: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/widget/TintTypedArray;.getType (I)I
答
关于logcat的错误:它的权限,你已经在你的manifest.xml界定?
确保已
android.permission.INTERNET
您还需要
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
的连接状态检查...
答
您使用的方法是依赖于以下网址: "http://clients3.google.com/generate_204"
我不知道你为什么人们评论...使用它,而不是http://google.com
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
此外,你应该在后台运行此方法以避免阻塞UI线程。
您可以使用此代码:
private void isConnected() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
isOnline = checkInternet();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if(isOnline){
// do internet stuff..
}else{
// not connected..
}
}
}.execute();
}
private boolean checkInternet() {
try {
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 204 &&
urlc.getContentLength() == 0);
} catch (IOException e) {
return false;
}
}