简体   繁体   English

当我的设备实际连接到WIFI时,为什么我的设备似乎没有连接到互联网?

[英]Why doesn't my device appear to be connected to the internet when it is actually connected to WIFI?

The idea of this SSCCE app is that when the MainActivity is created (that is during onCreate() ), we check if the device is connected to the internet. 此SSCCE应用程序的想法是,在创建MainActivity时(即在onCreate()期间),我们将检查设备是否已连接到Internet。 If no, then it displays an AlertDialog saying "Please check your internet connection" . 如果否,则显示AlertDialog "Please check your internet connection"

During this if block, there is a while loop which executes if the internet connection is regained. 在此if块期间,如果重新获得Internet连接,则会执行while循环。

The problem is that it keeps displaying the dialog even when my emulator is connected to the wifi to which the host is connected, and so is my mobile phone connected to the wifi (I also tested on real phone). 问题是,即使我的仿真器连接到主机所连接的wifi,它也一直显示对话框,我的手机也连接到wifi(我也在真实电话上测试过)。 The question is why, and how can I fix this. 问题是为什么,以及如何解决此问题。

The other problem is that some weird exceptions are raised in the LogCat, and it ddoes log out the information "THE NETWORK IS NOW AVAILABLE" check (See code to see what this check is) 另一个问题是,一些奇怪的例外是在logcat中提出的,它ddoes注销信息, "THE NETWORK IS NOW AVAILABLE"检查(见代码,看看这张支票是什么)

RELEVANT PARTS OF SSCCE SSCCE的相关部分

MainActivity.java 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 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 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

About the logcat error: which permissions do you have defined at your manifest.xml? 关于logcat错误:您在manifest.xml中定义了哪些权限?

Make sure you have 确保你有

android.permission.INTERNET

You also need 你还需要

android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_WIFI_STATE android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_WIFI_STATE

for the connectivity state checking... 用于连接状态检查...

the approach your using is dependent on this url: "http://clients3.google.com/generate_204" 您使用的方法取决于以下网址: "http://clients3.google.com/generate_204"

I don't know why you have it commented... use it instead of http://google.com 我不知道您为什么要对此进行评论...用它代替http://google.com

HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());

Also, you should run this method in the background to avoid blocking the UI thread. 另外,您应该在后台运行此方法,以避免阻塞UI线程。

you can use this code: 您可以使用以下代码:

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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM