Reputation: 171
I am a beginner in Android application development. I will get latitude and longitude from GPSTracker.class
every 5 minutes for send to SQLite DB in next step but when I call GPSTracker.class
It's return latitude = 0.0 and longitude = 0.0 too
help me please
This is my code
AppService.class
public class AppService extends Service {
private MyThread thread;
PowerManager.WakeLock wl;
double latitude;
double longitude;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
thread = new MyThread();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!thread.isAlive()) {
thread.start();
}
return START_STICKY;
}
private class MyThread extends Thread {
private static final String tag = "Sevice Demo";
private static final int delay = 300000;
private int roundNumber = 0;
private boolean finishService = false;
@Override
public void run() {
while (true) {
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(
getApplicationContext().POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
wl.release();
GPSTracker gps = new GPSTracker(AppService.this);
latitude = gps.getLatitude();
longitude = gps.getLongitude();
Log.d("dddd",String.valueOf(latitude)+" & "+String.valueOf(longitude));
try {
sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (finishService) {
return;
}
}
}
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Stop...", Toast.LENGTH_LONG).show();
if (thread.isAlive()) {
stopService(new Intent(this, AppService.class));
}
super.onDestroy();
}
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location locations;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// get GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// get network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
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 TODO;
}
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
}
if (locationManager != null) {
locations = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (locations != null) {
latitude = locations.getLatitude();
longitude = locations.getLongitude();
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (locations == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
locations = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locations != null) {
latitude = locations.getLatitude();
longitude = locations.getLongitude();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return locations;
}
public double getLatitude() {
if (locations != null) {
latitude = locations.getLatitude();
}
return latitude;
}
public double getLongitude() {
if (locations != null) {
longitude = locations.getLongitude();
}
return longitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
}
Upvotes: 2
Views: 244
Reputation: 95568
This code
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
locations = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locations != null) {
latitude = locations.getLatitude();
longitude = locations.getLongitude();
}
}
needs to be refactored. When you call LocationManager.requestUpdates()
you are asking the LocationManager
to call your app back when there is an update to the GPS position. This will happen at some later time (in the future), depending on how long it takes for the phone to determine its position using GPS. The call to LocationManager.getLastKnownLocation()
will only return the last "known" location, which it doesn't have yet.
Once you have requested location updates, Your app will be called back with GPS data. The framework will call the method onLocationChanged()
. You currently have no code in that method, so you won't do anything when the method is called.
Upvotes: 0
Reputation: 3863
The fused location provider is a location API in Google Play services that intelligently combines different signals to provide the location information that your app needs.
The fused location provider manages the underlying location technologies, such as GPS and Wi-Fi, and provides a simple API that you can use to specify the required quality of service. For example, you can request the most accurate data available, or the best accuracy possible with no additional power consumption.
Upvotes: 1