如何在android中30秒后获取位置?

时间:2015-07-21 07:28:11

标签: android location

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.Toast;

public class LocationService extends Service {

    private LocationDatabaseHelper mLocationDatabaseHelper;
    private LocationModel mLocationModel;
    private Date mDate;
    private Handler mHandler = new Handler();
    private Timer mTimer = null;
    private int mCount = 0;

    public static final long NOTIFY_INTERVAL = 30 * 1000;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        // cancel if already existed
        if (mTimer != null) {
            mTimer.cancel();
        } else {
            // recreate new
            mTimer = new Timer();
        }

        mLocationModel = LocationModel.getInstance();
        // schedule task
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);

    }

    @Override
    public void onDestroy() {
        mTimer.cancel();
    }

    private class TimeDisplayTimerTask extends TimerTask implements LocationListener {

        @Override
        public void run() {

            mHandler.post(new Runnable() {

                @Override
                public void run() {
                    //I send message to draw map here
                    sendMessage();
                    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                            TimeDisplayTimerTask.this);

                }

            });
        }

        @Override
        public void onLocationChanged(Location location) {
            // I get location and do work here

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

    }

    private void sendMessage() {
          Intent intent = new Intent("my-event");
          intent.putExtra("message", "data");
          LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
        }
}

我想要的是每30秒后获取一次用户位置,但此代码无法正常工作。它的位置非常快(我想每一秒)。

我试图以这种方式获取位置,因为它可以在我启动app之后立即获取当前位置。我之前尝试过getLastKnowLocation,但它给了我最后一个已知的位置,这离我的位置很远。

请告诉我如何解决这个问题。谢谢!

3 个答案:

答案 0 :(得分:2)

requestLocationUpdates方法中的

第二个参数是位置更新之间的最小时间间隔,以毫秒为单位,所以你只需要这样做:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30 * 1000, 0, TimeDisplayTimerTask.this);

答案 1 :(得分:1)

根据Android开发人员参考文档

http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)

public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

注册位置更新时,LocationManager正在使用最新的LocationListener对象调用onLocationChanged(Location) Location方法。

requestLocationUpdates方法的第二个参数是

minTime位置更新之间的最短时间间隔(以毫秒为单位)

这并不意味着您将每隔30秒不断获得位置更新,因为如果无法获得位置,您也不会获得更新,如果位置未被更改,您将再次无法获得任何更新。

无论如何,如果您希望每隔30秒不断获得位置更新,您可以保留最新位置并使用调度程序发送,同时在调用onLocationChanged方法时更新它。

答案 2 :(得分:0)

尝试使用

TimerTask scanTask;
final Handler handler = new Handler();
mTimer = new Timer();

public void sendSMS(){

scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {
                            //your method here which you want to call every 30 sec
                        }
               });
        }};

    mTimer.schedule(scanTask, 30000, 30000); 
 }