调用getSystemService(Context.LOCATION_SERVICE)并且未调用onLocationChanged时出现NullpointerException

Sid*_*rth 5 android android-maps android-location

我正在尝试创建一个更新当前gps位置的后台服务.我正在NullPointerException排队LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

HomeActivity推出了一项服务

startService(new Intent(getApplicationContext(), ForHire.class));
Run Code Online (Sandbox Code Playgroud)

Service(ForHire)创建TimerTask更新

public class ForHire extends Service {

...
private Timer getUpdatesNow = new Timer();
private Updates updates = new Updates(getUpdatesNow);

@Override
public void onCreate() {
    ...
    getUpdatesNow.schedule(updates, God.KM20TIME);
    Log.v("Taxeeta", "Notification created");
}

    private class Updates extends TimerTask implements LocationListener {
    private Timer getUpdatesNow;

    public Updates(Timer newGetUpdatesNow) {
        super();
        getUpdatesNow = newGetUpdatesNow;
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                God.KM20TIME, God.KM20DISTANCE, (LocationListener) this);
    }
    public void run() {
        ...
        //do some cleanup
    }
            @Override
    public void onLocationChanged(Location location) {
        Log.v("Taxeeta", "Location changed");
        // do a update of the current location.
    }
Run Code Online (Sandbox Code Playgroud)

第一个问题是我得到了NullPointerException.第二个问题是,如果我注释掉LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, God.KM20TIME, God.KM20DISTANCE, (LocationListener) this);这两行,就永远不会调用onLocationChanged .

我的清单

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<application ...>
   ...
   <uses-library android:name="com.google.android.maps" />
</application>
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

编辑:Values of KM20TIME = 5000(5秒)和KM20DISTANCE = 1(1米).除了下面的修理,我走出了我的房子,启用了GPS,从阳台的一个角落走到另一个角落.我注意到我的gps(LSB)随着我每5秒从一个角落走到另一个角落而改变.

Sam*_*Sam 11

您最早可以打电话的new Updates(getUpdatesNow);是服务onCreate()方法.原因很简单,getSystemService()需要一个在进入之前不存在的有效上下文onCreate().

尝试:

private Timer getUpdatesNow;
private Updates updates;

@Override
public void onCreate() {
    ...
    getUpdatesNow = new Timer();
    updates = new Updates(getUpdatesNow);
Run Code Online (Sandbox Code Playgroud)