Запуск LocationManager в качестве службы Android - PullRequest
6 голосов
/ 29 декабря 2011

Я пытаюсь при получении сообщения c2dm запустить службу, которая запрашивает местоположение в течение «х» времени, а затем передает это местоположение нашему серверу. Сообщение c2dm правильно запускает службу, и местоположение GPS включается, но оно никогда не обновляется. Он просто сидит там в течение указанного мной времени (в настоящее время 12 секунд) и ничего не делает. Я использую точно такой же код где-то еще в моем приложении (не в качестве службы), и он работает отлично. Что я делаю не так?

Служба запускается при получении сообщения c2dm.

context.startService(new Intent(context, ServicePingLocation.class));

Это код самой службы. Все, что когда-либо вызывается, это "onCreate" и "onStart".

public class ServicePingLocation extends Service implements LocationListener {

private final String DEBUG_TAG = "[GPS Ping]";
private boolean xmlSuccessful = false;
private boolean locationTimeExpired = false;

private LocationManager lm;
private double latitude;
private double longitude;
private double accuracy;

@Override
public void onLocationChanged(Location location) {
    Log.d(DEBUG_TAG, "onLocationChanged");

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    accuracy = location.getAccuracy();
}

@Override
public void onProviderDisabled(String provider) {
    Log.d(DEBUG_TAG, "onProviderDisabled");
    Toast.makeText(
            getApplicationContext(),
            "Attempted to ping your location, and GPS was disabled.",
            Toast.LENGTH_LONG).show();
}

@Override
public void onProviderEnabled(String provider) {
    Log.d(DEBUG_TAG, "onProviderEnabled");
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    Log.d(DEBUG_TAG, "onStatusChanged");

}

@Override
public void onCreate() {
    Log.d(DEBUG_TAG, "onCreate");
}

@Override
public void onDestroy() {
    Log.d(DEBUG_TAG, "onDestroy");
}

@Override
public IBinder onBind(Intent intent) {
    Log.d(DEBUG_TAG, "onBind");

    return null;
}

@Override
public void onStart(Intent intent, int startid) {
    Log.d(DEBUG_TAG, "onStart");

    lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000,
            300f, this);

    Log.d(DEBUG_TAG, lm.toString());

    new SubmitLocationTask(ServicePingLocation.this).execute();
}

private void locationTimer() {

    new Handler().postDelayed(new Runnable() {
        // @Override
        @Override
        public void run() {
            locationTimeExpired = true;
        }
    }, 12000);
}

private class SubmitLocationTask extends AsyncTask<String, Void, Boolean> {

    /** application context. */
    private Context context;

    private Service service;

    public SubmitLocationTask(Service service) {
        this.service = service;
        context = service;
    }

    @Override
    protected void onPreExecute() {
        locationTimer(); // Start 12 second timer
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        if (success && xmlSuccessful) {
            lm.removeUpdates(ServicePingLocation.this);
            onDestroy();
        } else {
            if (!GlobalsUtil.DEBUG_ERROR_MSG.equals(""))
                Toast.makeText(getBaseContext(),
                        GlobalsUtil.DEBUG_ERROR_MSG, Toast.LENGTH_SHORT)
                        .show();
            GlobalsUtil.DEBUG_ERROR_MSG = "";
        }
    }

    @Override
    protected Boolean doInBackground(final String... args) {
        try {

            DateFormat df = null;
            df = new SimpleDateFormat("M/d/yy h:mm a");
            Date todaysDate = new Date();// get current date time with
                                            // Date()
            String currentDateTime = df.format(todaysDate);

            while ((accuracy > 100f || accuracy == 0.0)
                    && !locationTimeExpired) {
                // We just want it to sit here and wait.
            }

            return xmlSuccessful = SendToServerUtil.submitGPSPing(
                    0, longitude,
                    latitude, accuracy, currentDateTime);
        } catch (Exception e) {

            return false;
        }
    }
}

}

[Изменить] Исправлена ​​проблема, которая у меня была. Код действительно работал. Я добавил сетевого провайдера, настроил метод onDestroy (), чтобы остановить службу, и подправил время, используемое для захвата сигнала GPS.

Спасибо за совет, CommonsWare

1 Ответ

0 голосов
/ 31 декабря 2011

Исправлена ​​проблема, которая у меня была.Код действительно работал.Я добавил сетевого провайдера, настроил метод onDestroy () для остановки службы и изменил время, используемое для захвата сигнала GPS.

Спасибо за совет, CommonsWare

...