0

这个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 

回答

1

关于logcat的错误:它的权限,你已经在你的manifest.xml界定?

确保已

android.permission.INTERNET 

您还需要

android.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_WIFI_STATE

的连接状态检查...

0

您使用的方法是依赖于以下网址: "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; 
    } 
} 
相关问题