0
    package com.example.pointkeeper;
        import java.util.ArrayList;

    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util

    public class ServicePointKeeper extends Service implements LocationListener{

    double latitude;
    double longitude;
    private LocationManager lm;
    ArrayList<Point> pt;
    Point p;
    private Context context;
    private Location loc;
    private final static long TEMPO_DE_ATUALIZACAO = 1 * 60 * 1000 ;

    private final static float DISTANCIA_DE_ATUALIZACAO = 1 ;

    public void setGPS(){

        Criteria criteria = new Criteria();
        criteria.setAccuracy( Criteria.ACCURACY_FINE );
        criteria.setAltitudeRequired(true);
        String provider = lm.getBestProvider(criteria, true);

        if ( provider == null ) {
            Log.d("SistemaGPS.ativar", "Nenhum provedor encontrado.");
        } else {
            Log.d("SistemaGPS.ativar", "Provedor utilizado: " + provider);

            //lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
            lm.requestLocationUpdates(provider, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
        }
    }

    public void updateList(){
        p.setLatitude(loc.getLatitude());
        p.setLongitude(loc.getLongitude());
        pt.add(p);
    }


        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            loc = location;
            Toast.makeText(getApplicationContext(), "Lat: " + loc.getLatitude() + "Long: " + loc.getLongitude(), Toast.LENGTH_LONG).show();
            updateList();

        }

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

        }

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

        }

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

        }       

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Toast.makeText(getBaseContext(), "Serviço iniciado", Toast.LENGTH_SHORT).show();
        this.loc = null;
        pt = new ArrayList<Point>();
        p = new Point();
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        setGPS();
        Toast.makeText(getBaseContext(), "GPS setado", Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Serviço parado", Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(), "Lat: " + latitude + "Long: " + longitude, Toast.LENGTH_SHORT).show();
        Intent it = new Intent(getApplicationContext(), ShowPoints.class);
        it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Bundle b = new Bundle();
        b.putParcelableArrayList("points", pt);
        it.putExtras(b);
        startActivity(it);
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }



}

したがって、このコードでは、ポイントのリストを、後で使用するポイントの ArrayList に保存することを意図しています。しかし、すべてのポイント (緯度と経度) の値は同じです。最初の値を取得すると、他のすべての値は同じになります。onLocationChanged が呼び出されないようです。誰かが私を助けることができますか?

4

1 に答える 1

1

updateListへのすべての呼び出しを上書きしているグローバルポイントpがあります。これまで新しいポイントを作成していないため、これにより古い値が上書きされます。つまり、リスト内のすべての要素には、その時点の値ではなく、常に最新の値が含まれます。

また、関数にパラメーターを渡すのではなく、なぜどこでもクラス変数を使用しているのですか? あなたは Java やリファレンスをよく理解していないように感じます。

編集:

locals を正しく使用すると、コードは次のようになります。

package com.example.pointkeeper;
    import java.util.ArrayList;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util

public class ServicePointKeeper extends Service implements LocationListener{

private LocationManager lm;
ArrayList<Point> pt;
private final static long TEMPO_DE_ATUALIZACAO = 1 * 60 * 1000 ;

private final static float DISTANCIA_DE_ATUALIZACAO = 1 ;

public void setGPS(){

    Criteria criteria = new Criteria();
    criteria.setAccuracy( Criteria.ACCURACY_FINE );
    criteria.setAltitudeRequired(true);
    String provider = lm.getBestProvider(criteria, true);

    if ( provider == null ) {
        Log.d("SistemaGPS.ativar", "Nenhum provedor encontrado.");
    } else {
        Log.d("SistemaGPS.ativar", "Provedor utilizado: " + provider);

        //lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
        lm.requestLocationUpdates(provider, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
    }
}

public void updateList(Location loc){
    Point p = new Point();
    p.setLatitude(loc.getLatitude());
    p.setLongitude(loc.getLongitude());
    pt.add(p);
}


    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Lat: " + location.getLatitude() + "Long: " + location.getLongitude(), Toast.LENGTH_LONG).show();
        updateList(location);

    }

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

    }

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

    }

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

    }       

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(getBaseContext(), "Serviço iniciado", Toast.LENGTH_SHORT).show();
    pt = new ArrayList<Point>();
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    setGPS();
    Toast.makeText(getBaseContext(), "GPS setado", Toast.LENGTH_SHORT).show();
    return START_STICKY;
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "Serviço parado", Toast.LENGTH_SHORT).show();
    Toast.makeText(getApplicationContext(), "Lat: " + latitude + "Long: " + longitude, Toast.LENGTH_SHORT).show();
    Intent it = new Intent(getApplicationContext(), ShowPoints.class);
    it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Bundle b = new Bundle();
    b.putParcelableArrayList("points", pt);
    it.putExtras(b);
    startActivity(it);
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

}

于 2013-07-06T11:43:04.280 に答える