Pavan Welihinda
Pavan Welihinda

Reputation: 655

GPS locations are not retrieved properly

Im new to android development and i understand the android activity life cycle. Please see the following code.

    public class MyTest extends Activity{

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

        cont = getApplicationContext();
        final MyLocation my_loc = new MyLocation ();
        my_loc.initialize(cont);

        myMethod();
        }

    Public void myMethod()
    {
       //here when I retrieve the values, it always shows 0.0.
    }
}

    public class MyLocation implements LocationListener {
        public double user_lat;
        public double user_lng;
        private LocationManager locationManager;
        private Context ctx;

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            user_lat = location.getLatitude();
            user_lng = location.getLongitude();     

            //here i save the values for constands to use in myMethod                           
            }
        }

        public void initialize(Context context) {
            this.ctx = context;
            locationManager = (LocationManager) context
                    .getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 0, 0, this);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                    0, this);
        } 
}

Why is it that i cannot initialize GPS and retrieve long and lat values in the same activity?

Upvotes: 1

Views: 1965

Answers (3)

Siddharth
Siddharth

Reputation: 9574

LocationClient is the new way of getting GPS. Watch video for complete details on the recent update.

Note that the LocationManager way of doing things is buggy, since there is need to add a lot of code for GPS and NETWORK provider. The new way (internal to Google referred to as the Fused Location Provider) works with sensors to reduce battery consumption big time. Also reduces the need for complex API's and stage wise selection of the best provider. Its just 2-3 lines of code and you are done.

With many Samsung phones (Y model including) though there is a specific issue that most of the times they don't return location at all. So you need to kick start that phone to return the GPS. To do that you can use

HomeScreen.getLocationManager().requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
        @Override
        public void onLocationChanged(final Location location) {
        }
    });

And then call your locationClient.getLastLocation api. As in put the code above, just before your LocationClient.getLastLocation or LocationManager.getLastKnownLocation call.

Mind you Samsung is the highly customized android open source product. Google cannot respond to samsung related bugs, and Samsung does not have any android developer related support.

Edit : Watch the video, trust me, without knowing what LocationClient gives you, you wont appreciate the change. You will also learn about GeoFenceing.

Upvotes: 3

Luser_k
Luser_k

Reputation: 11

In order to your location question, I would suggest you another new way of retrieving locations.

Check this out: google play util

The code below is just a snippet, not fully ;). You dont need to handle gps/network providers anymore. It handles for you, which one is the best and returns a location.

LocationClient mLocationClient = new LocationClient(...)
mLocationClient.connect();
...
onConnected(Bundle ...){
LocationRequest request = LocationRequest.create();
request.setNumUpdates(1);
...
mLocationClient.requestLocationUpdates(request, new LocationListener....)
....

}

Upvotes: 1

Parag Chauhan
Parag Chauhan

Reputation: 35946

I made one service for that. It is easy for get Longitude / Latitude using it.

Copy/paste this class in your project.

package com.sample;
    import com.sample.globalconstant;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;

    public class MyServiceGPS extends Service
    {
        private static final String TAG = "BOOMBOOMTESTGPS";
        private LocationManager mLocationManager = null;
        private static final int LOCATION_INTERVAL = 1000;
        private static final float LOCATION_DISTANCE = 10f;

        private class LocationListener implements android.location.LocationListener{
            Location mLastLocation;
            public LocationListener(String provider)
            {
                Log.e(TAG, "LocationListener " + provider);
                mLastLocation = new Location(provider);
            }
            public void onLocationChanged(Location location)
            {
                Log.e(TAG, "onLocationChanged: " + location.getLatitude() +"....."+ location.getLongitude());
                globalconstant.lat  = location.getLatitude();
                globalconstant.lon  = location.getLongitude();
                Toast.makeText(getApplicationContext(), location.getLatitude() +"....."+ location.getLongitude(), 1000).show();
                mLastLocation.set(location);
            }
            public void onProviderDisabled(String provider)
            {
                Log.e(TAG, "onProviderDisabled: " + provider);           
            }
            public void onProviderEnabled(String provider)
            {
                Log.e(TAG, "onProviderEnabled: " + provider);
            }
            public void onStatusChanged(String provider, int status, Bundle extras)
            {
                Log.e(TAG, "onStatusChanged: " + provider);
            }
        }
        LocationListener[] mLocationListeners = new LocationListener[] {
                new LocationListener(LocationManager.GPS_PROVIDER),
                new LocationListener(LocationManager.NETWORK_PROVIDER)
        };
        @Override
        public IBinder onBind(Intent arg0)
        {
            return null;
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            Log.e(TAG, "onStartCommand");
            super.onStartCommand(intent, flags, startId);      
            return START_STICKY;
        }
        @Override
        public void onCreate()
        {
            Log.e(TAG, "onCreate");
            initializeLocationManager();
            try {
                mLocationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                        mLocationListeners[1]);

            } catch (java.lang.SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore", ex);
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "network provider does not exist, " + ex.getMessage());
            }
            try {
                mLocationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                        mLocationListeners[0]);
            } catch (java.lang.SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore", ex);
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "gps provider does not exist " + ex.getMessage());
            }
        }
        @Override
        public void onDestroy()
        {
            Log.e(TAG, "onDestroy");
            super.onDestroy();
            if (mLocationManager != null) {
                for (int i = 0; i < mLocationListeners.length; i++) {
                    try {
                        mLocationManager.removeUpdates(mLocationListeners[i]);
                    } catch (Exception ex) {
                        Log.i(TAG, "fail to remove location listners, ignore", ex);
                    }
                }
            }
        }
        private void initializeLocationManager() {
            Log.e(TAG, "initializeLocationManager");
            if (mLocationManager == null) {
                mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
            }
        }
    }

Copy this code in your Activity when you want to start:

startService(new Intent(this,MyServiceGPS.class));

Create one class globalconstant:

public class globalconstant { public static double lat, lon; }

when you want to current latitude and longitude in your project only write this globalconstant.lat ,globalconstant.lon

Add uses-permission in Manifest

Upvotes: 0

Related Questions