2013-07-06 2 views
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에 Points 목록을 저장하려고합니다. 하지만 모든 점 (위도와 경도)은 동일한 값을 가지고 있습니다. 일단 첫 번째 값을 얻으면 다른 모든 값은 동일합니다. onLocationChanged는 호출되지 않습니다. 누군가 나를 도울 수 있습니까?onLocationChanged() 메서드가 다른 위치를 얻지 못했습니다.

+0

있다는 이유 그렇지는 않습니다 :

여기

이 코드를 올바르게 사용 현지인들과 같이 보일 것입니다 무엇 에뮬레이터에서 테스트 할 때마다 매번 수동 값을 전달하여 onLocationChange 메소드를 호출해야합니다. –

+0

내 넥서스 4에서 테스트 중입니다. –

답변

1

updateList에 대한 모든 호출을 덮어 쓰는 전역 지점 p가 있습니다. 새로운 포인트를 생성하지 않으므로 이전 값을 덮어 씁니다. 즉, 목록의 모든 요소는 그 당시의 값이 아니라 항상 최신 값을 갖게됩니다.

또한 왜 함수에 매개 변수를 전달하지 않고 클래스 변수를 사용하고 있습니까? 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{ 

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

} 당신이 에뮬레이터 제어 다른 경도 위도 값을 보내고 있습니까

+0

내 글로벌 포인트 p는 새로운 지오 코딩을 가져야하고리스트를 업데이트해야하지만, 포인트 p는 항상 동일한 값을 갖습니다. 어디에서 참조를 사용해야합니까? –

+0

아니요, p는 전역이 아니어야합니다. 로컬이어야합니다. p가 글로벌이라는 사실이 당신의 문제입니다. Loc, 위도 및 경도는 전역이 아니어야합니다. 문제는 글로벌을 사용할시기와 로컬을 사용할시기, 선택 효과를 참조하는 방법을 모르는 것입니다. –

+0

편집 한 코멘트에서 loc, p, 위도 및 경도와 같은 코드가 표시되어야하는 클래스 레벨 변수가 없는지, 그리고 각 업데이트에 대해 새 포인트가 할당되었는지 확인하십시오. –

관련 문제