5

現在のGPS位置を更新するバックグラウンドサービスを作成しようとしています。私はNullPointerExceptionラインを取得していますLocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

HomeActivityがサービスを開始

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

サービス(ForHire)はTimerTaskUpdatesを作成します

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);2番目の問題は、これらの2行をコメントアウトすると、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>

ここで何が欠けていますか?

編集:Values of KM20TIME = 5000(5秒)、およびKM20DISTANCE = 1(1メートル)。以下の修正とは別に、私は家を出てGPSを有効にし、バルコニーの隅から隅まで歩いた。5秒ごとに1つのコーナーから別のコーナーに移動すると、GPS(LSB)が変化することに気付きました。

4

3 に答える 3

11

呼び出すことができる最も早いものnew Updates(getUpdatesNow);は、サービスのonCreate()メソッド内にあります。単純な理由は、getSystemService()に入る前に存在しない有効なコンテキストが必要なことですonCreate()

試す:

private Timer getUpdatesNow;
private Updates updates;

@Override
public void onCreate() {
    ...
    getUpdatesNow = new Timer();
    updates = new Updates(getUpdatesNow);
于 2013-01-22T04:07:43.767 に答える
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);
于 2013-01-22T04:22:25.377 に答える
2
@Override
public void onCreate() {
     new Updates(getUpdatesNow);
    ...
    getUpdatesNow.schedule(updates, God.KM20TIME);
    Log.v("Taxeeta", "Notification created");
}
于 2013-01-22T04:12:51.033 に答える