Libathos
Libathos

Reputation: 3362

Getting coordinates explicitly from GPS provider

I want to achieve something which I though was simple enough, but now I end up being a little confused. I want to get the coordinates of the user in this way

I used both locationManager and onLocationChange(), and the new API with locationClient but I can't get the coordinates from my device's GPS, only from network.

This is the one with the locationManager

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use default
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);

// Initialize the location fields
if (location != null) {
    System.out.println("Provider " + provider + " has been selected.");
    // new AlertDialog.Builder(v.getContext()).setMessage("Provider " + provider + " has been selected.").show();
    onLocationChanged(location);   
    System.out.println(location.getLatitude());
    Intent intent = new Intent(getApplicationContext(),DriveMeActivity.class);
    intent.putExtra("monument", monument);
    intent.putExtra("latitude", location.getLatitude());
    intent.putExtra("longitude",location.getLongitude());
    startActivity(intent);
} else {
    new AlertDialog.Builder(con).setMessage("Location not available").show();
    System.out.println("Location not available");
    System.out.println("Location not available");
}

and this is the one with locationClient

GooglePlayServicesUtil.isGooglePlayServicesAvailable(v.getContext())
if(mLocationClient.getLastLocation()!=null)
    Toast.makeText(getApplicationContext(),
        mLocationClient.getLastLocation().getLongitude()+ "|" + 
        mLocationClient.getLastLocation().getLatitude() ,
        Toast.LENGTH_SHORT).show();

Upvotes: 1

Views: 284

Answers (3)

Rohan Kandwal
Rohan Kandwal

Reputation: 9336

here's the complete code to find the best available provider whether gps or network and show settings menu to enable the location services.

    public class DSLVFragmentClicks extends Activity implements LocationListener {
private final int BESTAVAILABLEPROVIDERCODE = 1;
private final int BESTPROVIDERCODE = 2;
LocationManager locationManager;
String bestProvider;
String bestAvailableProvider;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == BESTPROVIDERCODE) {
        if (requestCode != Activity.RESULT_OK || locationManager.isProviderEnabled(bestProvider)) {
            Toast.makeText(getActivity(), "Error! Location Service " + bestProvider + " not Enabled", Toast.LENGTH_LONG).show();

        } else {
            getLocation(bestProvider);
        }
    } else {
        if (requestCode != Activity.RESULT_OK || locationManager.isProviderEnabled(bestAvailableProvider)) {
            Toast.makeText(getActivity(), "Error! Location Service " + bestAvailableProvider + " not Enabled", Toast.LENGTH_LONG).show();

        } else {
            getLocation(bestAvailableProvider);
        }
    }
}

public void getLocation(String usedLocationService) {
    Toast.makeText(getActivity(), "getting Location", Toast.LENGTH_SHORT).show();
    long updateTime = 0;
    float updateDistance = 0;
    // finding the current location 
    locationManager.requestLocationUpdates(usedLocationService, updateTime, updateDistance, this);

}


@Override
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.main);
    // set a Criteria specifying things you want from a particular Location Service
            Criteria criteria = new Criteria();
            criteria.setSpeedRequired(false);
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setCostAllowed(true);
            criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);
            criteria.setAltitudeRequired(false);

            locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
            // finding best provider without fulfilling the criteria
            bestProvider = locationManager.getBestProvider(criteria, false);
            // finding best provider which fulfills the criteria
            bestAvailableProvider = locationManager.getBestProvider(criteria, true);
            String toastMessage = null;
            if (bestProvider == null) {
                toastMessage = "NO best Provider Found";
            } else if (bestAvailableProvider != null && bestAvailableProvider.equals(bestAvailableProvider)) {
                boolean enabled = locationManager.isProviderEnabled(bestAvailableProvider);
                if (!enabled) {
                    Toast.makeText(getActivity(), " Please enable " + bestAvailableProvider + " to find your location", Toast.LENGTH_LONG).show();
// show settings menu to start gps or network location service
                    Intent mainIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(mainIntent, BESTAVAILABLEPROVIDERCODE);
                } else {
                    getLocation(bestAvailableProvider);
                }
                toastMessage = bestAvailableProvider + " used for getting your current location";
            } else {
                boolean enabled = locationManager.isProviderEnabled(bestProvider);
                if (!enabled) {
                    Toast.makeText(getActivity(), " Please enable " + bestProvider + " to find your location", Toast.LENGTH_LONG).show();
                    Intent mainIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(mainIntent, BESTPROVIDERCODE);
                } else {
                    getLocation(bestProvider);
                }
                toastMessage = bestProvider + " is used to get your current location";

            }
            Toast.makeText(getActivity(), toastMessage, Toast.LENGTH_LONG).show();
            return true;
        }
    });
}

@Override
public void onLocationChanged(Location location) {
    Log.d("Location Found", location.getLatitude() + " " + location.getLongitude());
    // getting the street address from longitute and latitude
    Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());
    String addressString = "not found !!";
    try {
        List<Address> addressList = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
        StringBuilder stringBuilder = new StringBuilder();
        if (addressList.size() > 0) {
            Address address = addressList.get(0);
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                stringBuilder.append(address.getAddressLine(i)).append("\n");
                stringBuilder.append(address.getLocality()).append("\n");
                stringBuilder.append(address.getPostalCode()).append("\n");
                stringBuilder.append(address.getCountryName()).append("\n");
            }

            addressString = stringBuilder.toString();
            locationManager.removeUpdates(this);
        }
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    Toast.makeText(getActivity(), " Your Location is " + addressString, Toast.LENGTH_LONG).show();
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void onProviderEnabled(String s) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void onProviderDisabled(String s) {
    //To change body of implemented methods use File | Settings | File Templates.
}
}

I have already explained a lot in comments but if you still don't understand something then feel free to ask.

Upvotes: 2

Ashish Bindal
Ashish Bindal

Reputation: 995

Most probably you don't have the location fix and GPS locationProvider takes time to get the location fix in compare to network location provider.

What can you do is that you can use the last known location fix.

String locationProvider = LocationManager.GPS_PROVIDER;
// Or use LocationManager.NETWORK_PROVIDER
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

But the further problem is that you might have the old location fix and network provider can provide you better location.

Android has really good documentation on this and sample code to find the best known location. http://developer.android.com/guide/topics/location/strategies.html

Upvotes: 1

Deepak Senapati
Deepak Senapati

Reputation: 1123

I hope you are trying it on a device and you have tried it out in open. In most cases You won't get gps coordinates until you step out.

Upvotes: 1

Related Questions