方法onLocationChanged()未获取其他位置 package com.example.pointkeeper; 导入java.util.ArrayList; 导入android.app.Service; 导入android.content.Context; 导入android.content.Intent; 导入android.location.Criteria; 导入android.location.location; 导入android.location.LocationListener; 导入android.location.LocationManager; 导入android.os.Bundle; 导入android.os.IBinder; 导入android.util 公共类ServicePointKeeper扩展服务实现LocationListener{ 双纬度; 双经度; 私人位置经理lm; ArrayList pt; p点; 私人语境; 私人位置loc; 私人最终静态长节拍=1*60*1000; 私人最终静态浮动距离a_DE_Atalizacao=1; 公共空间{ 标准=新标准(); 标准.设定精度(标准.精度\精细); 标准。setAltitudeRequired(真); 字符串提供程序=lm.getBestProvider(条件为true); if(提供程序==null){ Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”); }否则{ Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”); //lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件); lm.请求位置更新(提供程序、节奏、距离); } } 公共void updateList(){ p、 setLatitude(loc.getLatitude()); p、 setLongitude(loc.getLongitude()); 第二部分(p); } @凌驾 已更改位置上的公共无效(位置){ //TODO自动生成的方法存根 loc=位置; Toast.makeText(getApplicationContext(),“Lat:”+loc.getLatitude()+“Long:”+loc.getLatitude(),Toast.LENGTH_Long).show(); updateList(); } @凌驾 公共无效onProviderDisabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 公共无效onProviderEnabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 public void onStatusChanged(字符串提供程序、int状态、Bundle extra){ //TODO自动生成的方法存根 } @凌驾 公共int onStartCommand(Intent Intent、int标志、int startId){ //TODO自动生成的方法存根 Toast.makeText(getBaseContext(),“Serviço iniciado”,Toast.LENGTH_SHORT.show(); this.loc=null; pt=新的ArrayList(); p=新点(); lm=(LocationManager)getSystemService(Context.LOCATION\u服务); setGPS(); Toast.makeText(getBaseContext(),“GPS setado”,Toast.LENGTH_SHORT.show(); 返回开始时间; } @凌驾 公共空间{ //TODO自动生成的方法存根 Toast.makeText(getApplicationContext(),“Serviço parado”,Toast.LENGTH_SHORT.show(); Toast.makeText(getApplicationContext(),“Lat:+纬度+”长:“+经度,Toast.LENGTH_短)。show(); Intent it=newintent(getApplicationContext(),ShowPoints.class); it.setFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK); Bundle b=新Bundle(); b、 putParcelableArrayList(“点”,pt); 信息技术.附加指令(b); 星触觉(it); super.ondestory(); } @凌驾 公共IBinder onBind(意向){ //TODO自动生成的方法存根 返回null; } }

方法onLocationChanged()未获取其他位置 package com.example.pointkeeper; 导入java.util.ArrayList; 导入android.app.Service; 导入android.content.Context; 导入android.content.Intent; 导入android.location.Criteria; 导入android.location.location; 导入android.location.LocationListener; 导入android.location.LocationManager; 导入android.os.Bundle; 导入android.os.IBinder; 导入android.util 公共类ServicePointKeeper扩展服务实现LocationListener{ 双纬度; 双经度; 私人位置经理lm; ArrayList pt; p点; 私人语境; 私人位置loc; 私人最终静态长节拍=1*60*1000; 私人最终静态浮动距离a_DE_Atalizacao=1; 公共空间{ 标准=新标准(); 标准.设定精度(标准.精度\精细); 标准。setAltitudeRequired(真); 字符串提供程序=lm.getBestProvider(条件为true); if(提供程序==null){ Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”); }否则{ Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”); //lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件); lm.请求位置更新(提供程序、节奏、距离); } } 公共void updateList(){ p、 setLatitude(loc.getLatitude()); p、 setLongitude(loc.getLongitude()); 第二部分(p); } @凌驾 已更改位置上的公共无效(位置){ //TODO自动生成的方法存根 loc=位置; Toast.makeText(getApplicationContext(),“Lat:”+loc.getLatitude()+“Long:”+loc.getLatitude(),Toast.LENGTH_Long).show(); updateList(); } @凌驾 公共无效onProviderDisabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 公共无效onProviderEnabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 public void onStatusChanged(字符串提供程序、int状态、Bundle extra){ //TODO自动生成的方法存根 } @凌驾 公共int onStartCommand(Intent Intent、int标志、int startId){ //TODO自动生成的方法存根 Toast.makeText(getBaseContext(),“Serviço iniciado”,Toast.LENGTH_SHORT.show(); this.loc=null; pt=新的ArrayList(); p=新点(); lm=(LocationManager)getSystemService(Context.LOCATION\u服务); setGPS(); Toast.makeText(getBaseContext(),“GPS setado”,Toast.LENGTH_SHORT.show(); 返回开始时间; } @凌驾 公共空间{ //TODO自动生成的方法存根 Toast.makeText(getApplicationContext(),“Serviço parado”,Toast.LENGTH_SHORT.show(); Toast.makeText(getApplicationContext(),“Lat:+纬度+”长:“+经度,Toast.LENGTH_短)。show(); Intent it=newintent(getApplicationContext(),ShowPoints.class); it.setFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK); Bundle b=新Bundle(); b、 putParcelableArrayList(“点”,pt); 信息技术.附加指令(b); 星触觉(it); super.ondestory(); } @凌驾 公共IBinder onBind(意向){ //TODO自动生成的方法存根 返回null; } },android,gps,location,Android,Gps,Location,因此,在这段代码中,我的意图是将一个点列表保存在一个点的ArrayList中,稍后将使用该列表。但是所有的点(纬度和经度)都有相同的值,一旦我有了第一个值,所有其他的值都是相同的,看起来onLocationChanged从未被调用过。 有人能帮我吗?您有一个全局点p,您正在覆盖对updateList的每个调用。由于从未创建过新点,因此将覆盖旧值。这意味着列表中的每个元素都将始终具有最新的值,而不是当时的值 还有,为什么到处都使用类变量,而不是将参数传递给函数?我感觉您不太了解Java或引用 编辑

因此,在这段代码中,我的意图是将一个点列表保存在一个点的ArrayList中,稍后将使用该列表。但是所有的点(纬度和经度)都有相同的值,一旦我有了第一个值,所有其他的值都是相同的,看起来onLocationChanged从未被调用过。
有人能帮我吗?

您有一个全局点p,您正在覆盖对updateList的每个调用。由于从未创建过新点,因此将覆盖旧值。这意味着列表中的每个元素都将始终具有最新的值,而不是当时的值

还有,为什么到处都使用类变量,而不是将参数传递给函数?我感觉您不太了解Java或引用

编辑:

以下是正确使用局部变量时代码的外观:

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



}
package com.example.pointkeeper;
导入java.util.ArrayList;
导入android.app.Service;
导入android.content.Context;
导入android.content.Intent;
导入android.location.Criteria;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.os.IBinder;
导入android.util
公共类ServicePointKeeper扩展服务实现LocationListener{
私人位置经理lm;
ArrayList pt;
私人最终静态长节拍=1*60*1000;
私人最终静态浮动距离a_DE_Atalizacao=1;
公共空间{
标准=新标准();
标准.设定精度(标准.精度\精细);
标准。setAltitudeRequired(真);
字符串提供程序=lm.getBestProvider(条件为true);
if(提供程序==null){
Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”);
}否则{
Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”);
//lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件);
lm.请求位置更新(提供程序、节奏、距离);
}
}
公共无效更新列表(位置loc){
点p=新点();
p、 setLatitude(loc.getLatitude());
p、 setLongitude(loc.getLongitude());
第二部分(p);
}
@凌驾
位置更改后的公共无效(位置
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;
}