繁体   English   中英

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

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

此SSCCE应用程序的想法是,在创建MainActivity时(即在onCreate()期间),我们将检查设备是否已连接到Internet。 如果否,则显示AlertDialog "Please check your internet connection"

在此if块期间,如果重新获得Internet连接,则会执行while循环。

问题是,即使我的仿真器连接到主机所连接的wifi,它也一直显示对话框,我的手机也连接到wifi(我也在真实电话上测试过)。 问题是为什么,以及如何解决此问题。

另一个问题是,一些奇怪的例外是在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;
    }
}

暂无
暂无

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

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