2013-04-07 17 views
5

जांचना जारी रखें, मैं अब कुछ दिनों के लिए इस पर काम कर रहा हूं। मैंने अभी एंड्रॉइड के साथ काम करना शुरू कर दिया। मेरे पास 2 भाग का सवाल है। मैं जांचना चाहता हूं कि इंटरनेट उपलब्ध है या नहीं। यदि यह अलर्ट नहीं देता है और वेब व्यू को लोड होने से रोकता है तो यह वेब व्यू लॉन्च करता है। मैंने कोशिश की है लेकिन अगर इंटरनेट कनेक्शन नहीं है तो यह बल बंद हो जाता है (उदाहरण के लिए विमान मोड)। मैं इसे संदेश देने और वेबव्यू लोड करना बंद करने के लिए कैसे प्राप्त करूं। कनेक्शन के निरंतर जांच करने का एक तरीका भी है ताकि वेबपृष्ठ 404 कनेक्शन खोने पर दिखाया न जाए?एंड्रॉइड - कोई इंटरनेट कनेक्शन नहीं है और

मेरा कोड यहां है।

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


} 

संपादित करें: जोड़ा त्रुटियाँ विशिष्ट होना करने के लिए, मैं इन त्रुटियों को जब वापस दबाने के बाद यह कह कोई इंटरनेट कनेक्ट टोस्ट से पता चलता मिलता है। अगर मैं टोस्ट संदेश के बाद बैक बटन का उपयोग करता हूं और त्रुटियां नीचे होती हैं तो यह दुर्घटनाग्रस्त हो जाती है। यदि आपके आवेदन लगातार इंटरनेट कनेक्शन की जरूरत है,

.... 
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(); 
} 
..... 

अब:

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

आप नल पॉइंटर एक्सेप्शन हो रही है coz अपने वेबव्यू रिक्त है में इन अनुमतियों जोड़ें। आप केवल तभी सेट करते हैं जब इंटरनेट उपलब्ध हो। जब इंटरनेट उपलब्ध नहीं है तो आप टोस्ट प्रदर्शित करते हैं। लेकिन आप दृश्य को सेट नहीं कर रहे हैं। – Raghunandan

उत्तर

19

जांच करने के लिए नेटवर्क कनेक्शन उपलब्धता नीचे

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

    } 
} 
    } 

का उपयोग अपनी गतिविधि

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

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

वापस बटन प्रेस

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

अद्यतन पर में: आप नेटवर्क कनेक्शन उपलब्धता देखने के लिए की जरूरत है हर समय, सिस्टम कनेक्टिविटी चेंज होने पर ईवेंट प्रसारित करता है o कनेक्टिविटी की हानि। प्रसारण के लिए पंजीकरण करके आप अपनी गतिविधि में उन प्रसारणों को कैप्चर कर सकते हैं। लेकिन आवश्यकता होने पर आपको पंजीकरण रद्द करने की आवश्यकता है।

एक उदाहरण नीचे दिए गए लिंक पर है।

Android service to check internet connectivity?

या आप ऐसी सेवा का उपयोग कर सकते हैं जो पृष्ठभूमि में इंटरनेट कनेक्टिविटी की जांच करे। लेकिन आवश्यकता होने पर आपको सेवा को नष्ट करने की जरूरत है। लेकिन सेवा पृष्ठभूमि में लंबे चल रहा आपरेशन चल रहा

अद्यतन 2 के लिए प्रयोग किया जाता है:

नीचे की कोशिश करो। मैंने परीक्षण किया है यह मेरे सैमसंग गैलेक्सी एस 3 पर काम करता है।

प्रकट

 <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"/> 

आपका 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> 

आपकी गतिविधि

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

धन्यवाद लेकिन ऐप अभी भी आपके कोड के साथ वापस उपयोग करके क्रैश हो जाता है। –

+0

प्रेस बैकबटन पर जांचें कि क्या वेब व्यू शून्य है या नहीं। Logcat के अनुसार Coz यह एक nullpointer अपवाद है। मेरा अनुमान है कि आपका वेबव्यू शून्य – Raghunandan

+0

है इसलिए मैंने वेब व्यू चेक लिया और फिर ऐप बंद कर देगा। तो किसी भी तरह से यह अभी भी दबाकर वेब व्यू का उपयोग करने की कोशिश कर रहा है। यदि कथन कथन काम नहीं कर रहा है। –

1

दुर्घटनाग्रस्त से आप आवेदन रखने के लिए, सभी कोड है कि जगह है जहाँ आप अपने इंटरनेट कनेक्शन की जांच करने के WebView को परिभाषित करता है ले जाने के इस तरह मैं आपको Service बनाने के लिए सुझाव दूंगा जो लगातार इस कनेक्शन की जांच करेगा, और जब यह मौजूद होगा Service सुनने वाले पार्टियों को प्रसारण प्रसारित करेगा।

अद्यतन:

आप इस लाइन की वजह से एक त्रुटि प्राप्त कर रहे हैं:

webView.goBack(); 

अगर कोई इंटरनेट कनेक्शन था और WebView तो instantiated नहीं किया गया था आप कर सकते हैं नहीं GoBack() में क्योंकि यह शून्य है, यहां आपको जांचने की आवश्यकता है:

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

और वैकल्पिक दृश्य सेट करने में कुछ भी मुश्किल नहीं है: 1. दृश्य संपादक खोलें और एक छवि दृश्य को अपने वेबव्यू के समान आकार के साथ बनाएं। 2. फिर ऐसा करते हैं:

.... 
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(); 
} 
..... 

निश्चित रूप से आप इससे पहले कि आप में हेरफेर कर सकते हैं आईडी द्वारा इस दृश्य को खोजने के लिए पहले होगा।

+0

ठीक है, इससे मदद मिली लेकिन यह सिर्फ टोस्ट देता है और एक सफेद स्क्रीन पर रहता है और यदि आप बैक बटन का उपयोग करते हैं, तो यह लटकता है और मजबूर हो जाता है। वैसे भी पीछे का उपयोग करके ऐप से बाहर निकलने की कोशिश कर दुर्घटनाग्रस्त नहीं होने के लिए और शायद उस सादे सफेद स्क्रीन के स्थान पर एक लोगो दिखाएं? –

+0

क्या आप क्रैश होने पर लॉगकट संदेश दिखा सकते हैं। और आप एक वैकल्पिक छवि दृश्य बना सकते हैं और इंटरनेट कनेक्शन स्थिति के अनुसार उन दृश्यों की दृश्यता के साथ खेलते हैं। –

+0

आप वैकल्पिक दृश्य जोड़ने के लिए इसे इतना आसान बनाते हैं। कहीं भी कोई उदाहरण? इसके अलावा मैंने बैक का उपयोग करते समय प्राप्त त्रुटियों को चिपकाया। –

संबंधित मुद्दे