2013-11-27 473 views
0

當沒有可用的互聯網連接時,我的應用程序崩潰,但通過WiFi或數據連接連接到互聯網時工作正常。當互聯網關閉時,Android應用程序崩潰

有人能告訴我如何添加一個異常以避免崩潰?

下面是代碼:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONObject; 

import android.app.Dialog; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 


public class MainActivity extends FragmentActivity implements LocationListener{ 

    GoogleMap mGoogleMap; 
    Spinner mSprPlaceType; 

    String[] mPlaceType=null; 
    String[] mPlaceTypeName=null; 

    double mLatitude=0; 
    double mLongitude=0; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  

     // Array of place types 
     mPlaceType = getResources().getStringArray(R.array.place_type); 

     // Array of place type names 
     mPlaceTypeName = getResources().getStringArray(R.array.place_type_name); 

     // Creating an array adapter with an array of Place types 
     // to populate the spinner 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, mPlaceTypeName); 

     // Getting reference to the Spinner 
     mSprPlaceType = (Spinner) findViewById(R.id.spr_place_type); 

     // Setting adapter on Spinner to set place types 
     mSprPlaceType.setAdapter(adapter); 

     Button btnFind; 

     // Getting reference to Find Button 
     btnFind = (Button) findViewById(R.id.btn_find); 


     // Getting Google Play availability status 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 


     if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available 

      int requestCode = 10; 
      Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
      dialog.show(); 

     }else { // Google Play Services are available 

      // Getting reference to the SupportMapFragment 
      SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 

      // Getting Google Map 
      mGoogleMap = fragment.getMap(); 

      // Enabling MyLocation in Google Map 
      mGoogleMap.setMyLocationEnabled(true); 



      // Getting LocationManager object from System Service LOCATION_SERVICE 
      LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

      // Creating a criteria object to retrieve provider 
      Criteria criteria = new Criteria(); 

      // Getting the name of the best provider 
      String provider = locationManager.getBestProvider(criteria, true); 

      // Getting Current Location From GPS 
      Location location = locationManager.getLastKnownLocation(provider); 

      if(location!=null){ 
        onLocationChanged(location); 
      } 

      locationManager.requestLocationUpdates(provider, 20000, 0, this); 

      // Setting click event lister for the find button 
      btnFind.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 


        int selectedPosition = mSprPlaceType.getSelectedItemPosition(); 
        String type = mPlaceType[selectedPosition]; 


        StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
        sb.append("location="+mLatitude+","+mLongitude); 
        sb.append("&radius=5000"); 
        sb.append("&types="+type); 
        sb.append("&sensor=true"); 
        sb.append("&key=AIzaSyAuoLlC1LnlbneuG8cZEo3NCFHEstk0vpE"); 


        // Creating a new non-ui thread task to download Google place json data 
        PlacesTask placesTask = new PlacesTask();         

        // Invokes the "doInBackground()" method of the class PlaceTask 
        placesTask.execute(sb.toString()); 


       } 
      }); 

     }  

    } 

    /** A method to download json data from url */ 
    private String downloadUrl(String strUrl) throws IOException{ 
     String data = ""; 
     InputStream iStream = null; 
     HttpURLConnection urlConnection = null; 
     try{ 
       URL url = new URL(strUrl);     


       // Creating an http connection to communicate with url 
       urlConnection = (HttpURLConnection) url.openConnection();     

       // Connecting to url 
       urlConnection.connect();     

       // Reading data from url 
       iStream = urlConnection.getInputStream(); 

       BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

       StringBuffer sb = new StringBuffer(); 

       String line = ""; 
       while((line = br.readLine()) != null){ 
         sb.append(line); 
       } 

       data = sb.toString(); 

       br.close(); 

     }catch(Exception e){ 
       Log.d("Exception while downloading url", e.toString()); 
     }finally{ 
       iStream.close(); 
       urlConnection.disconnect(); 
     } 

     return data; 
    }   


    /** A class, to download Google Places */ 
    private class PlacesTask extends AsyncTask<String, Integer, String>{ 

     String data = null; 

     // Invoked by execute() method of this object 
     @Override 
     protected String doInBackground(String... url) { 
      try{ 
       data = downloadUrl(url[0]); 
      }catch(Exception e){ 
       Log.d("Background Task",e.toString()); 
      } 
      return data; 
     } 

     // Executed after the complete execution of doInBackground() method 
     @Override 
     protected void onPostExecute(String result){    
      ParserTask parserTask = new ParserTask(); 

      // Start parsing the Google places in JSON format 
      // Invokes the "doInBackground()" method of the class ParseTask 
      parserTask.execute(result); 
     } 

    } 

    /** A class to parse the Google Places in JSON format */ 
    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ 

     JSONObject jObject; 

     // Invoked by execute() method of this object 
     @Override 
     protected List<HashMap<String,String>> doInBackground(String... jsonData) { 

      List<HashMap<String, String>> places = null;    
      PlaceJSONParser placeJsonParser = new PlaceJSONParser(); 

      try{ 
       jObject = new JSONObject(jsonData[0]); 

       /** Getting the parsed data as a List construct */ 
       places = placeJsonParser.parse(jObject); 

      }catch(Exception e){ 
        Log.d("Exception",e.toString()); 
      } 
      return places; 
     } 

     // Executed after the complete execution of doInBackground() method 
     @Override 
     protected void onPostExecute(List<HashMap<String,String>> list){    

      // Clears all the existing markers 
      mGoogleMap.clear(); 

      for(int i=0;i<list.size();i++){ 

       // Creating a marker 
       MarkerOptions markerOptions = new MarkerOptions(); 

       // Getting a place from the places list 
       HashMap<String, String> hmPlace = list.get(i); 

       // Getting latitude of the place 
       double lat = Double.parseDouble(hmPlace.get("lat"));     

       // Getting longitude of the place 
       double lng = Double.parseDouble(hmPlace.get("lng")); 

       // Getting name 
       String name = hmPlace.get("place_name"); 

       // Getting vicinity 
       String vicinity = hmPlace.get("vicinity"); 

       LatLng latLng = new LatLng(lat, lng); 

       // Setting the position for the marker 
       markerOptions.position(latLng); 

       // Setting the title for the marker. 
       //This will be displayed on taping the marker 
       markerOptions.title(name + " : " + vicinity);    

       // Placing a marker on the touched position 
       mGoogleMap.addMarker(markerOptions);    

      }  

     } 

    } 



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

    @Override 
    public void onLocationChanged(Location location) { 
     mLatitude = location.getLatitude(); 
     mLongitude = location.getLongitude(); 
     LatLng latLng = new LatLng(mLatitude, mLongitude); 

     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 
} 

下面是logcat的日誌:

11-27 21:48:26.715: E/ActivityManager(242): ---wwd->startActivityLocked(14),packagename=in.wptrafficanalyzer.locationnearby,className=in.wptrafficanalyzer.locationnearby.MainActivity 
11-27 21:48:26.831: E/FaceService(17156): -1--wwd->onReceive-action=com.android.tdc.stoppreview,packageName=in.wptrafficanalyzer.locationnearby,className=in.wptrafficanalyzer.locationnearby.MainActivity 
11-27 21:48:26.912: E/FaceService(17156): -1--wwd->onReceive-action=com.android.tdc.stoppreview,packageName=in.wptrafficanalyzer.locationnearby,className=in.wptrafficanalyzer.locationnearby.MainActivity 
11-27 21:48:27.633: E/samfan(17143): gestureActive=0 
11-27 21:48:27.643: E/samfan(17143): gestureGallery=0 
11-27 21:48:28.026: E/AndroidRuntime(17236): FATAL EXCEPTION: main 
11-27 21:48:28.026: E/AndroidRuntime(17236): java.lang.RuntimeException: Unable to start activity ComponentInfo{in.wptrafficanalyzer.locationnearby/in.wptrafficanalyzer.locationnearby.MainActivity}: java.lang.SecurityException: ConnectivityService: Neither user 10089 nor current process has android.permission.ACCESS_NETWORK_STATE. 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread.access$600(ActivityThread.java:134) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.os.Looper.loop(Looper.java:154) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread.main(ActivityThread.java:4624) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at java.lang.reflect.Method.invoke(Method.java:511) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at dalvik.system.NativeStart.main(Native Method) 
11-27 21:48:28.026: E/AndroidRuntime(17236): Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10089 nor current process has android.permission.ACCESS_NETWORK_STATE. 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.os.Parcel.readException(Parcel.java:1327) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.os.Parcel.readException(Parcel.java:1281) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.net.IConnectivityManager$Stub$Proxy.getActiveNetworkInfo(IConnectivityManager.java:663) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.net.ConnectivityManager.getActiveNetworkInfo(ConnectivityManager.java:420) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at in.wptrafficanalyzer.locationnearby.MainActivity.onCreate(MainActivity.java:66) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.Activity.performCreate(Activity.java:4546) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) 
11-27 21:48:28.026: E/AndroidRuntime(17236): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041) 
11-27 21:48:28.026: E/AndroidRuntime(17236): ... 11 more 
11-27 21:48:28.599: E/Launcher(8336): Error finding setting, default accessibility to not found: accessibility_enabled 
11-27 21:48:28.603: E/Activity(8336): zbx The class is: com.android.phone 
11-27 21:48:28.604: E/FaceService(17156): -1--wwd->onReceive-action=com.sec.android.intent.action.HOME_RESUME,packageName=in.wptrafficanalyzer.locationnearby,className=in.wptrafficanalyzer.locationnearby.MainActivity 
+2

能否請您發佈錯誤日誌和顯示錯誤的行號? – JoelFernandes

+1

@JoelFernandes我已經添加了logcat日誌。 – DevCon

+0

你有沒有加入權限'android.permission.ACCESS_NETWORK_STATE'? – Naddy

回答

4

以下內容添加到您的清單文件:

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

謝謝我沒有清單中的android.permission.ACCESS_NETWORK_STATE。 – DevCon

+0

沒問題,如果有效,請確定您接受答案。否則,讓我知道,我們可以進一步看看。 – Brianjs

相關問題