在调用getSystemService(Context.LOCATION_SERVICE)时发生NullPointerException,而onLocationChanged不被调用。

5

我正在尝试创建一个后台服务来更新当前的GPS位置。在这一行代码LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);中,我遇到了一个NullPointerException

HomeActivity启动了该服务。

startService(new Intent(getApplicationContext(), ForHire.class));

服务(ForHire)创建一个计时器任务更新

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

首先有一个问题是我出现了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>

我在这里缺少什么?

编辑: KM20TIME的值为5000(5秒)KM20DISTANCE的值为1(1米)。除了下面的修复之外,在我的房子走出去后,启用GPS并从阳台的一个角落走到另一个角落。我注意到当我从一个角落走到另一个角落时,我的GPS(LSB)每5秒钟变化一次。

3个回答

11

在您的服务(Service)的 onCreate() 方法中,最早可以调用 new Updates(getUpdatesNow);。简单的原因是 getSystemService() 需要一个有效的上下文(Context),而在进入 onCreate() 之前,这个上下文还不存在。

尝试一下:

private Timer getUpdatesNow;
private Updates updates;

@Override
public void onCreate() {
    ...
    getUpdatesNow = new Timer();
    updates = new Updates(getUpdatesNow);

谢谢,已经修复了空指针异常。但是onLocationChanged仍然没有被调用。 - Siddharth
1
嗯,我不知道God.KM20TIMEGod.KM20DISTANCE是什么,但对于第一个修复来说这并不重要。不过你是否在可以接收GPS信号的位置呢?(我必须走到户外……) - Sam
KM20TIME 是 5 秒,KM20DISTANCE = 1,这样我就可以测试它。 - Siddharth
1
当您注释掉 requestLocationUpdates() 时,您从未得到位置,因为这是启动更新的行。但我看不出为什么您现在不应该得到更新... 其他 GPS 应用程序在您所在的位置是否工作,例如 Google 地图? - Sam
现在工作了,谢谢。你说的一切都是正确的。给你点赞。 - Siddharth

3
// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (location != null) {
    Toast.makeText(getBaseContext(),
                            "Last Location is found..",
                            Toast.LENGTH_LONG).show();  
} else {

    Toast.makeText(getBaseContext(),
                            "Last Location is not found..",
                            Toast.LENGTH_LONG).show();
}
LocationListener locationListener = new LocationListener() {
public void onStatusChanged(String provider,
    int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
    Toast.makeText(getApplicationContext(),
        "Gps Enabled", Toast.LENGTH_SHORT).show();
}
public void onProviderDisabled(String provider) {
    Toast.makeText(getApplicationContext(),
        "Gps Disabled", Toast.LENGTH_SHORT).show();
}

@Override
public void onLocationChanged(Location location) {
    Log.i("geolocation",
        "lat is : " + location.getLatitude()
        + " and " + location.getLongitude()
        + "");
    Toast.makeText(getBaseContext(),
    "Location is Changed..", Toast.LENGTH_LONG)
        .show();
}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0,
locationListener);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接