DevCon
DevCon

Reputation: 569

Android app crashes when internet is turned off

My app crashes when there is no internet connection available, but works fine when connected to the internet through wifi or data connection.

Can someone tell me how I can add an exception to avoid the crash?

Below is the code:

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

    }
}

Below is the logcat log:

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

Upvotes: 0

Views: 2896

Answers (1)

Brianjs
Brianjs

Reputation: 2239

Add the following to your manifest file:

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

Upvotes: 5

Related Questions