Reputation: 7164
hi i am doing a application based on gps,i use gps as service for my project ,when gps is turn on it show the location correctly and application runs fine ,but after that i exit from my app completely and when the gps turned off the it shows crash message.which mean even if l leave or exit my app the service class is still running ,and also app get crash if i turn off gps when app is running ,but if i did not turn of gps it work fine.Now how can i solve this problem. i will show my service class used for gps
public class Gps_Service extends Service {
TextView txtv;
List<Address> myList;
String addressStr;
LocationManager lm;
LocationListener ll;
SQLiteDatabase DiaryDB = null;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("@@@@@@@@@@@ serviceOnCreate");
// Toast.makeText(this, "GPS Service started(Diary)", Toast.LENGTH_LONG).show();
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new mylocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}
@Override
public void onDestroy() {
super.onDestroy();
// Toast.makeText(this, "GPS Service Destroyed(Diary)", Toast.LENGTH_LONG).show();
lm.removeUpdates(ll);
System.out.println("@@@@@@@@@@@ inside ONDESTROY GPS listener removed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.v("StartServiceAtBoot", "StartAtBootService -- onStartCommand()");
// Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
private class mylocationlistener implements LocationListener
{
public void onLocationChanged(Location location)
{
if (location != null) {
Geocoder myLocation = new Geocoder(Gps_Service.this, Locale.getDefault());
// Toast.makeText(MyService.this,location.getLatitude() + " " + location.getLongitude() +"\n",Toast.LENGTH_LONG).show();
// DiaryDB = MyService.this.openOrCreateDatabase("DIARY_DATABASE", MODE_PRIVATE, null);
// DiaryDB.execSQL("INSERT INTO Locations(LATITUDE, LONGITUDE) VALUES('" +location.getLatitude()+"','"+location.getLongitude()+"')");
// DiaryDB.close();
// ParseTweetsActivity.latitude = ""+location.getLatitude();
//ParseTweetsActivity.longitude = ""+location.getLongitude();
AndroidGoogleMapsActivity.lats = Double.parseDouble(""+location.getLatitude());
AndroidGoogleMapsActivity.longt = Double.parseDouble(""+location.getLongitude());
Advertiser_get_direction.latitudefrom = Double.parseDouble(""+location.getLongitude());
Advertiser_get_direction.longtitudefrom = Double.parseDouble(""+location.getLongitude());
AndroidGoogleMapsActivity.longt = Double.parseDouble(""+location.getLongitude());
System.out.println("saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+AndroidGoogleMapsActivity.lats);
// ParseTweetsActivity.load();
try
{
myList = myLocation.getFromLocation(location.getLatitude(),location.getLongitude(), 1);
} catch (IOException e) {
e.printStackTrace();
}
if(myList!=null)
{
Address address = (Address) myList.get(0);
addressStr = "";
addressStr += address.getAddressLine(0) + "\n";
addressStr += address.getAddressLine(1) + "\n";
addressStr += "Country name "+address.getCountryName() + "\n";
addressStr += "Locality "+address.getLocality() + "\n";
addressStr += "Country code "+address.getCountryCode() + "\n";
addressStr += "Admin Area "+address.getAdminArea() + "\n";
addressStr += "SubAdmin Area "+address.getSubAdminArea() + "\n";
addressStr += "PostalCode "+address.getPostalCode() + "\n";
// txtv.append(location.getLatitude() + " " + location.getLongitude() +"\n");
// txtv.append(addressStr+"\n");
System.out.println(location.getLatitude() + " " + location.getLongitude() +"\n");
lm.removeUpdates(ll);
}
}
}
public void onProviderDisabled(String provider)
{
// Toast.makeText(MyService.this,"Provider Disabled",Toast.LENGTH_LONG).show();
txtv.setText("");
}
public void onProviderEnabled(String provider)
{
// Toast.makeText(MyService.this,"Provider Enabled.....",Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
Upvotes: 0
Views: 2466
Reputation: 171
I had a problem like this when i didn`t release listener in the onDestroy(). Try to add the following code:
lm.unregisterListener(ll);
Upvotes: 0
Reputation: 28093
Change your code from
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new mylocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
to following
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new mylocationlistener();
if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0,ll);
}
Upvotes: 0
Reputation: 95578
You have declared a TextView
within your Service
. That's not good. TextView
is a UI component and doesn't belong on the service.
In your onProviderDisabled()
method, you call txtv.setText("");
which will probably crash because txtv
is null. This is probably why your app is crashing when you disable GPS.
Upvotes: 1