LocationListener不起作用(在intentService内)但getLastKnownLocation不起作用(返回不同的gps坐标)

时间:2016-08-03 00:07:08

标签: android gps location locationmanager locationlistener

我没有让它进入 onLocationChanged,onStatusChanged,onProviderEnabled,onProviderDisabled 我检查了关闭并打开了GPS 我在外面的办公室试过(因为这个计数器叫你在这个例子中看到的contador)

这是我的代码

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;
                }
            }


        }
    }

}

1 个答案:

答案 0 :(得分:1)

您的意图服务将从内存中删除,然后才能从其位置侦听器中获取正确的读数。这是因为在调用onHandleIntent(Intent intent)方法后,Intent Service会被销毁。尝试使用服务不断监听位置更新,并根据需要使用单独的Intent服务检索这些更新。

这是一个探索其他用户如何做到这一点的链接。 Location listener works from a Service but not an IntentService

在其他用户提示和反馈后,请参阅该用户解决方案的“Edit3”。希望这会有所帮助。