1

I am trying to create an application that just displays the co-ordinates on the screen. Following permissions are added in the manifest file.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

The following is the code in MainActivity.java

import com.example.location.R;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.provider.Settings;

public class MainActivity extends Activity {

double latitude;
double longitude;

TextView lat, longi, loc, status;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lat = (TextView)findViewById(R.id.latitude);
    longi = (TextView)findViewById(R.id.longitude);
    status = (TextView)findViewById(R.id.status);
    loc = (TextView)findViewById(R.id.location);

    ContentResolver contentResolver = getBaseContext().getContentResolver();  
    boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.GPS_PROVIDER); 

    if(gpsStatus){
        status.setText("GPS_PROVIDER is enabled.");
        // This is to check if GPS_PROVIDER is enabled or not.
        // This is working.
    }
}

@Override
protected void onResume(){
    super.onResume();
    loc.setText("Entered Resume method"); //This works as well.
    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();

            String str_lat = String.valueOf(latitude);
            String str_longi = String.valueOf(longitude);

            lat.setText(str_lat);
            longi.setText(str_longi);
            loc.setText((CharSequence) location);
        }
        @Override
        public void onStatusChanged(String provider, int status,Bundle extras) {
            // TODO Auto-generated method stub  
        }
        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }
    };
    final LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    //Location Location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    //double altitude = Location.getAltitude();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
}  
}

The app doesnot settext for the latitude and the longitude texts, When running in the emulator, I donot see any errors. I am not even getting the latitude and longitude as 0.0, 0.0.

While running the app in the phone, after few seconds, the app closes with dialogbox "Unfortunately, App has stopped"

Following is the error messages in the logCat.

11-04 23:35:48.250: E/AndroidRuntime(1224): FATAL EXCEPTION: main
11-04 23:35:48.250: E/AndroidRuntime(1224): Process: com.example.location, PID: 1224
11-04 23:35:48.250: E/AndroidRuntime(1224): java.lang.ClassCastException: android.location.Location cannot be cast to java.lang.CharSequence
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.example.location.MainActivity$1.onLocationChanged(MainActivity.java:65)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:279)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:208)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:224)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.os.Looper.loop(Looper.java:136)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.app.ActivityThread.main(ActivityThread.java:5017)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at java.lang.reflect.Method.invokeNative(Native Method)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at java.lang.reflect.Method.invoke(Method.java:515)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at dalvik.system.NativeStart.main(Native Method)

I am new into android programming, so kindle correct me if I am doing any silly mistakes and help me learn. Any help debugging this is greatly appreciated.

user3543477
  • 615
  • 3
  • 13
  • 26
  • It means your location object is null – Karan Mavadhiya Nov 05 '14 at 04:31
  • Please post the error that you see in Logcat when "Unfortunately, App has stopped" this appears. http://stackoverflow.com/questions/2279647/how-to-emulate-gps-location-in-the-android-emulator is a good pointer to get location values via emulator. – Vny Kumar Nov 05 '14 at 04:33
  • @VnyKumar : That really helped, I was trying to display the entire content of location as a charsequence. That was the error. – user3543477 Nov 05 '14 at 04:44

4 Answers4

1

Try This class for location

import com.arco.util.location.GPSTracker;
import com.arco.util.location.LocationUtils;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;

public class MYActivity extends Activity implements OnClickListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {

    // Global variable to hold the current location
    Location mCurrentLocation;
    // Request to connect to Location Services
    private LocationRequest mLocationRequest;
    // Stores the current instantiation of the location client in this object
    private LocationClient mLocationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        // Create a new global location parameters object
        mLocationRequest = LocationRequest.create();
        // Set the update interval
        mLocationRequest.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
        // Use high accuracy
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        // Set the interval ceiling to one minute
        mLocationRequest.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
        mLocationClient = new LocationClient(this, this, this);




    } // End OnCreate()



    @Override
    public void onStart() {
        super.onStart();
        mLocationClient.connect();
    }

    @Override
    public void onStop() {
        mLocationClient.disconnect();
        super.onStop();
    }

    /**
     * Verify that Google Play services is available before making a request.
     */
    private boolean servicesConnected() {

        // Check that Google Play services is available
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        // If Google Play services is available
        if (ConnectionResult.SUCCESS == resultCode) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult mConnectionResult) {

        if (mConnectionResult.hasResolution()) {
            try {
                // Start an Activity that tries to resolve the error
                mConnectionResult.startResolutionForResult(this, LocationUtils.CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } 
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        try {
            if (servicesConnected()) {
                mLocationClient.requestLocationUpdates(mLocationRequest, this);
                // Get the current location
                Location currentLocation = mLocationClient.getLastLocation();
                if (currentLocation != null) {
                    mCurrentLocation = currentLocation;
                }
               mCurrentLocation.getLatitude();
               mCurrentLocation.getLongitude()
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDisconnected() {
    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
    }
}
Karan Mavadhiya
  • 1,042
  • 8
  • 23
1

@Moradiya Akash, @Karan Mavadhiya, @pratt : Thankyou so much for helping. I was trying to display the contents of location as charequence in the line

loc.setText((CharSequence) location);

Once I removed it, the app works fine. Thanks Vny Kumar for helping me debug the code myself, it would help me in a long run. :)

user3543477
  • 615
  • 3
  • 13
  • 26
  • Casting Location object to CharSequence is the main problem because there is no inheritance between them. Logcat helps us to find our problem more easily. so try to find out first what Logcat says. – Sayem Nov 05 '14 at 08:47
  • @Sayem : Yeah sure, I shall use logcat to find whats in the variables. – user3543477 Nov 05 '14 at 19:33
0

try like this,

put this code in oncreate()

try {
        LocationManager mlocManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
        LocationListner mListner = new LocationListner();
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try {
                        try {
                            mlocManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, mListner);
                        } catch (Throwable e) {
                        }

                        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                    }
                    try {
                        mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                    }

                }
            });
        } catch (Throwable e) {
        }

class LocationListner implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();

            String str_lat = String.valueOf(latitude);
            String str_longi = String.valueOf(longitude);

            lat.setText(str_lat);
            longi.setText(str_longi);
            loc.setText((CharSequence) location);
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

    }
Akash Moradiya
  • 3,318
  • 1
  • 14
  • 19
0

Try with below code:

public static LocationManager mlocManager;
public static LocationListener mListner;
private String lat;
public  String longi;

//Just call this method from onCreate().
private void getLatitudeAndLongitude() {
        try {
            mlocManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
            mListner = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    setLatitude("" + location.getLatitude());
                    setLongitude("" + location.getLongitude());
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {

                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s) {

                }
            };

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try {
                        try {
                            mlocManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, mListner);
                        } catch (Throwable e) {
                            e.printStackTrace();
                        }

                        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                    try {
                        mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }

                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

public void setLatitude(String latitide) {
        lat = latitide;
    }

    public void setLongitude(String longitude) {
        longi = longitude;
    }

    public String getLatitude() {
        if (lat != null) {
            return lat;
        }
        Location loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (loc == null) {
            loc = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (loc == null) {
                loc = mlocManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
            }
            if (loc != null) {
                return "" + loc.getLatitude();
            }
        } else {
            return "" + loc.getLatitude();
        }
        return "0";
    }

    public String getLongitude() {
        if (longi != null) {
            return longi;
        }
        Location loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (loc == null) {
            loc = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (loc == null) {
                loc = mlocManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
            }
            if (loc != null) {
                return "" + loc.getLongitude();
            }
        } else {
            return "" + loc.getLongitude();
        }
        return "0";
    }
Pratik Dasa
  • 7,439
  • 4
  • 30
  • 44