Reputation: 571
I want to get current latitude and longitude when user clicks on a button . to do so ,I've written these codes :
LocationManager mlocManager=null;
LocationListener mlocListener;
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Log.v("this",MyLocationListener.latitude+ " lat");
if(MyLocationListener.latitude>0){
in = new Intent(DrawerActivity.this, Barbers.class);
in.putExtra("w", "nearest");
in.putExtra("latitude",Double.toString(MyLocationListener.latitude));
in.putExtra("longitude",Double.toString(MyLocationListener.longitude));
startActivity(in);
}else{
MyToast.makeText(DrawerActivity.this, Z_Farsi.Convert(getString(R.string.gpsfinding)));
}
} else {
MyToast.makeText(DrawerActivity.this, Z_Farsi.Convert(getString(R.string.gpsoffline)));
}
The gps is on and the current location is showing on google map perfectly .
What is the problem ? why it returns 0.0 ?
how to solve this ?
Upvotes: 1
Views: 2649
Reputation: 5626
What I have come to notice with location features is that you cannot acquire a user location instantly. You have to wait for the device to give you the location.
Normally, I would have my code in my Application class then for example when a user clicks the button, you call a method inside the application class and let the user know (through a progress dialog??) that they should wait for the latitude and longitude to be acquired.
Next thing would be to use an event to notify the activity or fragment of the location availability then dismissing the progress dialog once you have your data.
Just know that you cannot easily get the current location when you want like immediately. Sometimes, when indoors, it doesn't even work as expected.
Good luck!
Upvotes: 0
Reputation: 1169
Try like this
manager.requestLocationUpdates("gps", 10, 10, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double lat=location.getLatitude();
double lon=location.getLognitude()
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
});
Upvotes: 0
Reputation: 4891
This file will do the work for you. It will get the data from network-operator or GPS.
GPSTracker.java
public class GpsTracker extends Service implements LocationListener {
private final Context mContext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location;
double latitude;
double longitude;
private final long MIN_DISTANCE = 10;
private final long MIN_TIME = 30;
protected LocationManager locationManager;
public GpsTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider enabled
} else {
this.canGetLocation = true;
// first get location from network provider
if (isNetworkEnabled) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return null;
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS enabled get lat/long using GPS provider
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, this);
Log.d("GPS provider", "GPS provider");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/* Stop using GPS listener
* calling this function will stop using GPS in your app*/
public void stopUsingGPS() {
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(GpsTracker.this);
}
}
// functions to get latitude and longitude
public double getLatitude()
{
if(location != null){
latitude = location.getLatitude();
}
return latitude;
}
public double getLongitude()
{
if(location != null){
longitude = location.getLongitude();
}
return longitude;
}
// function to check whether GPS/WiFi is enabled
public boolean canGetLocation()
{
return this.canGetLocation;
}
/* Function to show alert dialog
* on pressing settings button will launch settings options */
public void showAlertDialog()
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
alertDialog.setTitle("GPS Settings").setMessage("GPS not Enabled. /n Want to enable it ? ").setCancelable(false);
alertDialog.setPositiveButton("Settings", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// Implicit intent
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
alertDialog.setNegativeButton("No", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
dialog.cancel();
}
});
alertDialog.show();
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
}
Upvotes: 0
Reputation: 1353
getLastKnownLocation
is missing. You should have something like this :
Location location = null;
if (mlocManager!= null) {
location = mlocManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
Upvotes: 1