2016-11-17 5 views
0

질문에서 언급했듯이 위도와 경도를 이중으로 저장하여 프로그램에서 사용할 수 있습니다.사용자 위치에서 위도와 경도 값을 저장하는 로직을 찾으려고 시도

setOnMyLocationChange listener를 사용할 수 있으며, 거기에서 위도와 경도를 저장하는 UserLocation 클래스의 객체를 만듭니다.

UserLocation.getLat()을 사용하여 리스너 메소드 내에서 인쇄 할 수 있지만 프로그램의 다른 곳에서 사용할 변수를 저장할 수 없습니다. 나는 관련성이 있다고 생각하는 코드를 게시 할 것이다.

은 내가 청취자의 변수를 참조 할 수 있지만 UserLocation의 난) 내가 l.getLat에 대해서 null 객체 참조가 (무엇입니까 여기

UserLocation l; 

전역 변수로 저장합니다. 여기

else if (city.equals("myLocation")) { 

      map.setMyLocationEnabled(true); 
      Location myLocation = map.getMyLocation(); 
      map.setOnMyLocationChangeListener(this); 
//   map.setOnMyLocationChangeListener(null); 
      lat = l.getLat(); 
      lon = l.getLng(); 
      Toast.makeText(this, lat+" is latMy in map activity ", Toast.LENGTH_LONG).show(); 


     } 

내가 여기

@Override 
    public void onMyLocationChange(Location location) { 

     latMy = location.getLatitude(); 
     lngMy = location.getLongitude(); 
     l = new UserLocation(); 
     l.setLat(latMy); 
     l.setLng(lngMy); 
     Toast.makeText(this, latMy+" is latMy in LOCATION CHANGE ", Toast.LENGTH_LONG).show(); 

    } 

잘 값을 출력 할 수 있습니다 내가 검색 한 많이 시도했지만에 고체 답변을 찾을 수있다

package com.example.its.citymap; 

public class UserLocation { 
    private double lat; 
    private double lng; 

    public double getLat() { 
     return lat; 
    } 

    public void setLat(double lat) { 
     this.lat = lat; 
    } 

    public double getLng() { 
     return lng; 
    } 

    public void setLng(double lng) { 
     this.lng = lng; 
    } 
} 

내 UserLocation 클래스입니다 이.

고맙습니다.

+0

스토어 그 UserLocation 클래스 레벨의 변수이다. 거기에 어떤 트릭도 없습니다. –

+2

개체를 공유 환경 설정에 저장하십시오. –

+0

여기에서 제가 시도한 것이 아닙니까? –

답변

0

우선 무엇이 활성화되어 있는지 확인합니다. 일부는 장치에서 비활성화 될 수 있으며 일부는 응용 프로그램 매니페스트에서 비활성화 될 수 있습니다.

사용할 수있는 공급자가 있으면 위치 수신기와 시간 제한 타이머를 시작할 수 있습니다. 제 예제에서는 20 초입니다. GPS를 사용하기에는 충분하지 않을 수 있으므로 확대 할 수 있습니다.

위치 수신기에서 업데이트를 얻으면 제공된 값을 사용합니다. 나는 청취자와 타이머를 멈춘다.

업데이트가없고 타이머가 경과하면 마지막으로 알려진 값을 사용해야합니다.

나는 사용 가능한 공급자로부터 마지막으로 알려진 값을 가져 와서 가장 최근 값을 선택합니다. 여기

내가 내 클래스 사용 방법은 다음과 같습니다

LocationResult locationResult = new LocationResult(){ 
    @Override 
    public void gotLocation(Location location){ 
     //Got the location! 
    } 
}; 
MyLocation myLocation = new MyLocation(); 
myLocation.getLocation(this, locationResult); 
And here's MyLocation class: 

import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 
    LocationResult locationResult; 
    boolean gps_enabled=false; 
    boolean network_enabled=false; 

    public boolean getLocation(Context context, LocationResult result) 
    { 
     //I use LocationResult callback class to pass location value from MyLocation to user code. 
     locationResult=result; 
     if(lm==null) 
      lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

     //exceptions will be thrown if provider is not permitted. 
     try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
     try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} 

     //don't start listeners if no provider is enabled 
     if(!gps_enabled && !network_enabled) 
      return false; 

     if(gps_enabled) 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
     if(network_enabled) 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
     timer1=new Timer(); 
     timer1.schedule(new GetLastLocation(), 20000); 
     return true; 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerNetwork); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    LocationListener locationListenerNetwork = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerGps); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    class GetLastLocation extends TimerTask { 
     @Override 
     public void run() { 
      lm.removeUpdates(locationListenerGps); 
      lm.removeUpdates(locationListenerNetwork); 

      Location net_loc=null, gps_loc=null; 
      if(gps_enabled) 
       gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if(network_enabled) 
       net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      //if there are both values use the latest one 
      if(gps_loc!=null && net_loc!=null){ 
       if(gps_loc.getTime()>net_loc.getTime()) 
        locationResult.gotLocation(gps_loc); 
       else 
        locationResult.gotLocation(net_loc); 
       return; 
      } 

      if(gps_loc!=null){ 
       locationResult.gotLocation(gps_loc); 
       return; 
      } 
      if(net_loc!=null){ 
       locationResult.gotLocation(net_loc); 
       return; 
      } 
      locationResult.gotLocation(null); 
     } 
    } 

    public static abstract class LocationResult{ 
     public abstract void gotLocation(Location location); 
    } 
}