2013-04-07 10 views
5

Pracuję nad tym od kilku dni. Właśnie zacząłem pracować z Androidem. Mam 2 częściowe pytanie. chcę sprawdzić, czy Internet jest dostępny. Jeśli jest uruchamiany, webView, jeśli nie daje ostrzeżenia i zapobiega ładowaniu się webView. Próbowałem tego, ale wymusił zamknięcie, jeśli nie ma połączenia z Internetem (np. Tryb samolotowy). Jak mogę to zrobić, aby dać wiadomość i przestać ładować przeglądarkę internetową? Czy istnieje również sposób ciągłego sprawdzania połączenia, aby strona 404 nie była wyświetlana, gdy traci połączenie?Android - Pokaż komunikat, jeśli nie ma połączenia z Internetem i kontynuuj sprawdzanie

Oto mój kod.

public class MainActivity extends Activity { 

    private WebView webView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     android.net.NetworkInfo wifi = cm 
       .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     android.net.NetworkInfo datac = cm 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
     if ((wifi != null & datac != null) 
       && (wifi.isConnected() | datac.isConnected())) { 
      setContentView(R.layout.activity_main); 
       }else{ 
       //no connection 
        Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection", Toast.LENGTH_LONG); 
        toast.show(); 
     } 

     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptCookie(true); 

     webView = (WebView) findViewById(R.id.webview); 
     webView.setWebViewClient(new MyWebViewClient()); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.loadUrl("http://mysite.com/?ma=1"); 
    } 
     private class MyWebViewClient extends WebViewClient { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       if (Uri.parse(url).getHost().equals("mysite.com")) { 
        return false; 
       } 
       // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs 
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       startActivity(intent); 
       return true; 
      } 
     } 


    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // Check if the key event was the Back button and if there's history 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { 
      webView.goBack(); 
      return true; 
     } 
     // If it wasn't the Back key or there's no web page history, bubble up to the default 
     // system behavior (probably exit the activity) 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) 
     { 
      case R.id.logout: 
       finish(); 
       return true; 
     } 
     return false; 
    } 


} 

Edit: Dodano Błędy Mówiąc konkretnie, mam te błędy podczas naciskania powrotem po to pokazuje toast mówiąc, nie ma internetu połączyć. To zawiesza się, jeśli używam przycisku Wstecz po toast wiadomość i błędy są poniżej.

04-07 14:40:38.664: E/AndroidRuntime(15173): FATAL EXCEPTION: main 
04-07 14:40:38.664: E/AndroidRuntime(15173): java.lang.NullPointerException 
04-07 14:40:38.664: E/AndroidRuntime(15173): at com.mysite.testapp.MainActivity.onKeyDown(MainActivity.java:67) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.view.KeyEvent.dispatch(KeyEvent.java:2705) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.app.Activity.dispatchKeyEvent(Activity.java:2401) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2007) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3813) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3761) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2926) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.os.Looper.loop(Looper.java:137) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at android.app.ActivityThread.main(ActivityThread.java:4918) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at java.lang.reflect.Method.invoke(Method.java:511) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
04-07 14:40:38.664: E/AndroidRuntime(15173): at dalvik.system.NativeStart.main(Native Method) 
+0

otrzymujesz wyjątku null pointer coz Twój WebView jest null. Ustawiasz widok tylko wtedy, gdy dostęp do Internetu jest możliwy. Kiedy internet nie jest dostępny, wyświetlasz tosty. ale nie ustawiasz widoku. – Raghunandan

Odpowiedz

19

Aby sprawdzić dostępność Połączenie sieciowe użyć poniżej

public class CheckNetwork { 


private static final String TAG = CheckNetwork.class.getSimpleName(); 



public static boolean isInternetAvailable(Context context) 
{ 
    NetworkInfo info = (NetworkInfo) ((ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 

    if (info == null) 
    { 
     Log.d(TAG,"no internet connection"); 
     return false; 
    } 
    else 
    { 
     if(info.isConnected()) 
     { 
      Log.d(TAG," internet connection available..."); 
      return true; 
     } 
     else 
     { 
      Log.d(TAG," internet connection"); 
      return true; 
     } 

    } 
} 
    } 

W swojej działalności

   if(CheckNetwork.isInternetAvailable(Activity.this)) //returns true if internet available 
       { 

         //do something. loadwebview. 
       } 
       else 
       { 
        Toast.makeText(Activity.this,"No Internet Connection",1000).show(); 
       } 

na powrót naciśnięciu przycisku

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode) 
     { 
     case KeyEvent.KEYCODE_BACK: 
      if(mWebView.canGoBack() == true){ 
       mWebView.goBack(); 
      }else{ 
       finish(); 
      } 
      return true; 
     } 

    } 
    return super.onKeyDown(keyCode, event); 
    } 

UPDATE: jeśli trzeba, aby sprawdzić dostępność połączenia sieciowego przez cały czas System nadaje zdarzenia, gdy następuje zmiana łączności r utrata łączności. Możesz przechwycić te audycje w swojej działalności, rejestrując się w celu emisji. Ale musisz wyrejestrować, gdy nie jest to wymagane.

Przykład znajduje się pod linkiem poniżej.

Android service to check internet connectivity?.

Możesz też skorzystać z usługi sprawdzającej łączność internetową w tle. Ale musisz zniszczyć usługę, gdy nie jest to wymagane. Ale usługa jest wykorzystywana do prowadzenia operacji długo działające w tle

Aktualizacja 2:

Spróbuj poniżej. Testowałem. Działa na moim Samsung Galaxy S3.

Dodaj te uprawnienia w jawnym

 <uses-permission android:name="android.permission.INTERNET"/> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

swojej activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" > 

<WebView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:id="@+id/wv"/> 

</RelativeLayout> 

swoją aktywność

public class MainActivity extends Activity { 

private WebView webView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


     setContentView(R.layout.activity_main); 
     webView = (WebView) findViewById(R.id.wv); 
     if(CheckNetwork.isInternetAvailable(MainActivity.this)) 
     { 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptCookie(true); 

     // webView = (WebView) findViewById(R.id.wv); 
     // webView.setWebViewClient(new MyWebViewClient()); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebChromeClient(new WebChromeClient() { 
       public void onProgressChanged(WebView view, int progress) { 
       // Activities and WebViews measure progress with different scales. 
       // The progress meter will automatically disappear when we reach 100% 
       MainActivity.this.setProgress(progress * 1000); 
       } 
      }); 
      webView.setWebViewClient(new WebViewClient() { 
       public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 
       } 
      }); 

      webView.loadUrl("http://slashdot.org/"); 
      } 
    else{ 
      //no connection 
       Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection", Toast.LENGTH_LONG); 
       toast.show(); 
    } 


} 



@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { 
     webView.goBack(); 
     return true; 
    } 
    else 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
} 
+0

Dzięki, ale aplikacja nadal zawiesza się, używając ponownie z kodem, jak również. –

+0

w przypadku naciśnięcia przycisku wstecz sprawdź, czy webView ma wartość null lub nie. Coz według logcat jest wyjątkiem nullpointer. Domyślam się, że twoja przeglądarka internetowa ma wartość zerową. – Raghunandan

+0

Wyjąłem więc czek na webView, a następnie zamknę aplikację. Tak więc nadal próbuje użyć webView po ponownym naciśnięciu. Wydaje się, że instrukcja if nie działa. –

1

do siebie aplikację z upaść przenieść cały kod, który definiuje WebView do miejsca, gdzie można sprawdzić swoje połączenie internetowe, podobnie jak to:

.... 
if ((wifi != null & datac != null) && (wifi.isConnected() || datac.isConnected())) 
{ 
    setContentView(R.layout.activity_main); 
    webView = (WebView) findViewById(R.id.webview); 
    webView.setWebViewClient(new MyWebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl("http://mysite.com/?ma=1"); 
} 
else 
{ 
    //no connection 
    Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection",Toast.LENGTH_LONG); 
    toast.show(); 
} 
..... 

Teraz, jeśli aplikacja stale potrzebuje połączenia internetowego Proponuję Ci stworzyć Service, który będzie stale sprawdzał, czy to połączenie, i kiedy to istnieje, to Service wystrzeli transmisję do słuchaczy.

UPDATE:

Otrzymujesz błąd, ponieważ z tej linii:

webView.goBack(); 

Jeśli nie było internet i WebView nie została instancja to nie można goBack() w ponieważ ta wartość zerowa, musisz sprawdzić:

if (webView != null) 
{ 
    webView.goBack(); 
} 

I nic trudnego w ustaleniu alternatywnego widoku: 1. Otwórz edytor wizualny i utwórz widok ImageView o tym samym rozmiarze, co widok internetowy. 2. Wtedy to zrobić:

.... 
if ((wifi != null & datac != null) && (wifi.isConnected() || datac.isConnected())) 
{ 
    imageView.setVisibility(View.GONE); 
    setContentView(R.layout.activity_main); 
    webView = (WebView) findViewById(R.id.webview); 
    webView.setWebViewClient(new MyWebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl("http://mysite.com/?ma=1"); 
} 
else 
{ 
    imageView.setVisibility(View.VISIBLE); 
    //no connection 
    Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection",Toast.LENGTH_LONG); 
    toast.show(); 
} 
..... 

oczywiście trzeba by znaleźć ten pogląd przez ID zanim można go manipulować.

+0

OK, to pomogło, ale po prostu daje toast i pozostaje na białym ekranie, a jeśli używasz przycisku Wstecz, wisi i siłą zamyka. W każdym razie, aby nie awaryjnie próbować wyjść z aplikacji z tyłu i może pokazać logo zamiast zwykłego białego ekranu? –

+0

Czy możesz pokazać komunikat logcat po awarii. i możesz stworzyć alternatywny ImageView i po prostu grać z widocznością tych widoków zgodnie ze stanem połączenia internetowego. –

+0

sprawiłeś, że brzmi tak łatwo dodać alternatywny widok. Dowolne przykłady w dowolnym miejscu? Również wkleiłem błędy powyżej, które uzyskuję, używając Back. –

Powiązane problemy