Getting Latitude And Longitude 0.0 In Android M
Solution 1:
With the help of CommonsWare and Blackkara answer, I was able to solve my problem.
As per their suggestion I have changed my code and have a look after each and every step of my code with debugging.
Due to that I came with the problem that my onLocationChanged() did not get fired in the case of Marshmallow but surprisingly, it gets fire in the case of older devices which are less than Android M or 6.0.
For solving this I have changed my code as below, here I am posting the full code so that anyone who has the same problem can get rid of it.
GPSTracker.java
publicclassGPSTrackerextendsService{
private Context mContext;
// Flag for GPS statusbooleanisGPSEnabled=false;
// Flag for network statusbooleanisNetworkEnabled=false;
// Flag for GPS statusbooleancanGetLocation=false;
Location location; // Locationdouble latitude; // Latitudedouble longitude; // Longitude// The minimum distance to change Updates in metersprivatestaticfinallongMIN_DISTANCE_CHANGE_FOR_UPDATES=1000; // 10 meters// The minimum time between updates in millisecondsprivatestaticfinallongMIN_TIME_BW_UPDATES=1000 * 60 * 1; // 1 minute// Declaring a Location Managerprotected LocationManager locationManager;
Activity activity;
publicGPSTracker() {
}
publicGPSTracker(Context context, Activity activity) {
this.mContext = context;
this.activity = activity;
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 is enabled
} else {
this.canGetLocation = true;
if (isNetworkEnabled) {
intrequestPermissionsCode=50;
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, mLocationListener);
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 latitude/longitude using GPS Servicesif (isGPSEnabled) {
if (location == null) {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, newString[]{Manifest.permission.ACCESS_FINE_LOCATION}, 50);
} else {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, mLocationListener);
Log.d("GPS Enabled", "GPS Enabled");
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.
* */publicvoidstopUsingGPS() {
}
privatefinalLocationListenermLocationListener=newLocationListener() {
@OverridepublicvoidonLocationChanged(final Location location) {
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
@OverridepublicvoidonStatusChanged(String provider, int status, Bundle extras) {
}
@OverridepublicvoidonProviderEnabled(String provider) {
}
@OverridepublicvoidonProviderDisabled(String provider) {
}
};
/**
* Function to get latitude
* */publicdoublegetLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitudereturn latitude;
}
/**
* Function to get longitude
* */publicdoublegetLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitudereturn longitude;
}
/**
* Function to check GPS/Wi-Fi enabled
* @return boolean
* */publicbooleancanGetLocation() {
returnthis.canGetLocation;
}
/**
* Function to show settings alert dialog.
* On pressing the Settings button it will launch Settings Options.
* */publicvoidshowSettingsAlert() {
AlertDialog.BuilderalertDialog=newAlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing the Settings button.
alertDialog.setPositiveButton("Settings", newDialogInterface.OnClickListener() {
publicvoidonClick(DialogInterface dialog, int which) {
Intentintent=newIntent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// On pressing the cancel button
alertDialog.setNegativeButton("Cancel", newDialogInterface.OnClickListener() {
publicvoidonClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@Overridepublic IBinder onBind(Intent arg0) {
returnnull;
}
}
DashboardActivity.java
publicclassDashboardActivityextendsActivity {
Context mContext;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
mContext = this;
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DashboardActivity.this, newString[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else {
Toast.makeText(mContext,"You need have granted permission",Toast.LENGTH_SHORT).show();
gps = newGPSTracker(mContext, DashboardActivity.this);
// Check if GPS enabledif (gps.canGetLocation()) {
doublelatitude= gps.getLatitude();
doublelongitude= gps.getLongitude();
// \n is for new line
Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
} else {
// Can't get location.// GPS or network is not enabled.// Ask user to enable GPS/network in settings.
gps.showSettingsAlert();
}
}
}
@OverridepublicvoidonRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case1: {
// If request is cancelled, the result arrays are empty.if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the// contacts-related task you need to do.
gps = newGPSTracker(mContext, DashboardActivity.this);
// Check if GPS enabledif (gps.canGetLocation()) {
doublelatitude= gps.getLatitude();
doublelongitude= gps.getLongitude();
// \n is for new line
Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
} else {
// Can't get location.// GPS or network is not enabled.// Ask user to enable GPS/network in settings.
gps.showSettingsAlert();
}
} else {
// permission denied, boo! Disable the// functionality that depends on this permission.
Toast.makeText(mContext, "You need to grant permission", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
}
Manifest.xml :
Permission which are added
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permissionandroid:name="android.permission.INTERNET" />
Declare service in Application Tag:
<serviceandroid:name=".utilities.GPSTracker"/>
Solution 2:
You could be having below causes?
First cause
Location provider is not giving you 0.0 values as latitude and longitude. You are getting what had you define first time. Because, you didn't receive fresh location or getLastKnownLocation() returns null. So latitude and longitude variables keep their first values (0.0)
double latitude;
double longitude;
Second cause
Whenever you call getLocation() method, getLastKnownLocation() method will be doing nothing until onLocationChanged fire! (depending on provider)
@OverridepublicvoidonLocationChanged(Location location) {
}
Elaborated for 'depending on provider'
You have requested both gps and network providers.
requestLocationUpdates(LocationManager.NETWORK_PROVIDER ... mLocationListener);
requestLocationUpdates(LocationManager.GPS_PROVIDER ... mLocationListener);
And then has called getLastKnownLocation method for both two providers
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Assume that those two providers have returned null. In this case, you need to wait until onLocationChanged method has been fired. Otherwise you will be getting null from getLastKnownLocation method depending on provider
@OverridepublicvoidonLocationChanged(final Location location) {
StringproviderName= location.getProvider();
if(providerName.equals(LocationManager.GPS_PROVIDER)){
// onLocationChanged method is fired by gps provider.// After this point, getLastKnownLocation(); method returns not-null // for LocationManager.GPS_PROVIDER
}
if( providerName.equals(LocationManager.NETWORK_PROVIDER)){
// onLocationChanged method is fired by network provider.// After this point, getLastKnownLocation(); method returns not-null // for LocationManager.NETWORK_PROVIDER
}
}
Solution 3:
First, remove these:
<permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" /><permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />
Those are defined by the platform, not you.
Also, you are not reacting when the user actually grants permission to you. Request the permissions in your activity, and do not create an instance of GPSTracker
until you have permission. That may be immediately, if checkSelfPermission()
says that you have permission. Otherwise, that will be when the activity is called with onRequestPermissionResult()
.
The location work itself is also buggy, in that you seem to think that you will get a location immediately, which will not be the case much of the time.
Solution 4:
Guy I resolved this issue, first answer which is given in this blocks works fine. In order to remove the 0.0 from the Latitude and Longitude, just Go in your phone settings, open the app manager and grant the permission for app. it will show, as for letting it pending for user, we can throw the Dialog with permission.
Post a Comment for "Getting Latitude And Longitude 0.0 In Android M"