angel
angel

Reputation: 4632

LocationListener is not working (inside intentService) but getLastKnownLocation does (return different gps coordinates)

I don't get it enter in onLocationChanged,onStatusChanged,onProviderEnabled,onProviderDisabled I checked turn off and turn on the gps I tried outside office (for that the counter called contador you see in this example)

This is my code

import android.Manifest;
import android.app.IntentService;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;


/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p>
 * TODO: Customize class - update intent actions, extra parameters and static
 * helper methods.
 */
public class ISSubProcesoGps extends IntentService {
    // TODO: Rename actions, choose action names that describe tasks that this
    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS

    public static int hacambiado=0;

    LocationManager lm;

    double longitude;
    double latitude;

    Location location=null;

    public static volatile boolean shouldContinue = true;
    int contador = 0;


    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            longitude = location.getLongitude();
            latitude = location.getLatitude();
            //mLocation = location;
            //altitude = location.getAltitude();
            hacambiado++;
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
String x=s;
        }

        @Override
        public void onProviderEnabled(String s) {
            String x=s;
        }

        @Override
        public void onProviderDisabled(String s) {
            String x=s;
        }
    };


    // TODO: Rename parameters


    public ISSubProcesoGps() {

        super("ISSubProcesoGps");


    }

    /**
     * Starts this service to perform action Foo with the given parameters. If
     * the service is already performing a task this action will be queued.
     *
     * @see IntentService
     */


    @Override
    protected void onHandleIntent(Intent mIntent) {

        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);



        latitude = 0;
        longitude = 0;



        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);


            Intent intent = new Intent(getBaseContext(), MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

            Notification notification = new Notification.Builder(this)
                    .setSmallIcon(R.drawable.ic_menu_gallery)  // the status icon
                    .setTicker("hola muy myintentservice")  // the status text
                    .setWhen(System.currentTimeMillis())  // the time stamp
                    .setContentTitle("content title")  // the label of the entry
                    .setContentText("content teext")  // the contents of the entry
                    .setContentIntent(pendIntent)  // The intent to send when the entry is clicked
                    .build();

            startForeground(1, notification);

            while(true)
            {
                try {
                    location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    Thread.sleep(1000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(!shouldContinue)
                {
                    if(lm!=null)
                        lm.removeUpdates(locationListener);
                    lm=null;
                    break;
                }
            }


        }
    }

}

Upvotes: 0

Views: 495

Answers (1)

Blake
Blake

Reputation: 43

Your Intent Service is getting removed from memory before it can get a proper reading from it's location listeners. This is due to an Intent Service getting destroyed after it's method onHandleIntent(Intent intent) is called. Try listening to location updates constantly with a Service and retrieve those updates as needed with a separate Intent Service.

Here's a link that explores how another user did this. Location listener works from a Service but not an IntentService

See 'Edit3' for that users solution after tips and feedback from other users. Hope this helps.

Upvotes: 1

Related Questions