2011-08-25 2 views
0

메신저로 내 사용자를 찾고지도에서 다른 위치와의 거리를 계산합니다 (위도/경도는 정적 임). 이렇게하려면 다음을 사용하십시오.lat/lng를 사용하여 위도/경도를 새로 고침하거나 더 빨리로드하십시오.

private void findloc() { 
      // TODO Auto-generated method stub 

      try{ 
      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      Criteria criteria = new Criteria(); 
      provider = locationManager.getBestProvider(criteria, false); 
      Location location = locationManager.getLastKnownLocation(provider); 
      Double lat = Double.valueOf(location.getLatitude()); 
      Double lng = Double.valueOf(location.getLongitude()); 

      Location location2 = new Location("gps"); 
      location2.setLatitude(35.519583); 
      location2.setLongitude(24.016864); 


      float distance = location2.distanceTo(location); 
      TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm); 
      sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km"); 


      Toast.makeText(otto.this, "lat: "+lat+"\nlng: "+lng, 
      Toast.LENGTH_LONG).show(); 
     } 
      catch(Exception e){ 

       TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm); 
       sitesdistancekm.setText("No GPS signal");  


      } 
     } 

내 문제는 메뉴의 새로 고침으로 findloc()를 호출하지만 변경 사항을 나던 .im 때때로 위치 스택 및 메신저 잘못된 거리를 받고 있다는 것입니다.

public boolean onOptionsItemSelected(MenuItem item) { 

       findloc(); 

     return true; 
    } 

개선 할 수있는 방법이 있습니까?

수정

그게 효과가 있니?

private void findloc() { 
      // TODO Auto-generated method stub 

      try{ 
      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      Criteria criteria = new Criteria(); 
      provider = locationManager.getBestProvider(criteria, false); 
      Location location = locationManager.getLastKnownLocation(provider); 
      Double lat = Double.valueOf(location.getLatitude()); 
      Double lng = Double.valueOf(location.getLongitude()); 

      location2 = new Location("gps"); 
      location2.setLatitude(35.519583); 
      location2.setLongitude(24.016864); 


      float distance = location2.distanceTo(location); 
      TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm); 
      sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km"); 


      Toast.makeText(otto.this, "lat: "+lat+"\nlng: "+lng, 
      Toast.LENGTH_LONG).show(); 


      onLocationChanged(location); 

     } 
      catch(Exception e){ 

       TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm); 
       sitesdistancekm.setText("No GPS signal");  


      } 
     } 

     private void onLocationChanged(Location location) { 
     // TODO Auto-generated method st 


      float distance = location2.distanceTo(location); 
      TextView sitesdistancekm = (TextView) findViewById(R.id.sitesdistancekm); 
      sitesdistancekm.setText("Geographical Distance : "+distance/1000+" km"); 
    } 

답변

2

나는 getLastKnownLocation()이 위치 수신기를 등록하는만큼 신뢰할 수 없습니다 것으로 나타났습니다. 구현 방법에 대한 자세한 내용은 this 게시물을 참조하십시오.

getLastKnownLocation 워드 프로세서 상태 :

가 마지막으로 알려진 위치 에서 데이터를 나타내는 위치를 돌려줍니다은 지정된 프로 바이더로부터 얻은 수정합니다. 공급자를 시작하는 없이이 작업을 수행 할 수 있습니다. 기기가 꺼지고 다른 위치로 이동 한 경우이 위치는 예를 들어 오래된 것으로, 일 수 있습니다.

제게는 getLastKnownLocation()을 사용하여 초기 위치를 얻은 다음 다른 수신기에 대한 수신기를 등록합니다.

+0

IIRC, 문서의 언급을 의존하기 전에 위치 갱신을 제공 할 수 있는지 확인하기 위해 제공 호출 할 수 있습니다 GPS가 잠시 동안 켜져 있지 않은 경우와 같은 상황에서 – thegrinner

+0

@jack에 대한 예제 코드가 있습니까? – kostas

+0

지금은 위치 수신기로 시도했지만이 방법은 내 lat/lng를 사용하는 데 더 많은 시간이 필요합니다. – kostas

1

Jack의 대답을 참조하면 getLastKnownLocation을 위치 탐지의 유일한 척도로 사용해서는 안됩니다. 당신은 몇 가지 단계로 위치 검색 논리를 분할해야합니다

  • 상세한 정확성 그대로 그냥 마지막 위치를 알고 사용할 수 없습니다 그러나


    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 

    // you need to specify the criteria here 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestProvider = lm.getBestProvider(criteria, true); 

  • 에 대해 당신이 가진 최고의 공급자를 가져옵니다. 이 위치가 마지막으로 수정 된 시간을 확인해야합니다. 필요한 민감도에 따라 30 초에서 5 분 사이의 경과 시간을 확인할 수 있습니다.

    Location locate = lm.getLastKnownLocation(bestProvider); 
    if(System.currentTimeMillis() - locate.getTime() < TIME_TO_EXPIRE) { 
     // this is a valid location, let's use this location 
     // as the last time the provider check is within reasonable boundary 
    } 
 
마지막으로 알려진 업데이트 예상 시간을 당신의 경계를 통과하는 경우
  • , 당신은 위치 (사용자가 다른 곳으로 이동) 너무 오래되어 업데이트해야합니다 가정 할 수있다. 당신을위한 다음 단계는 당신이 볼 수 있듯이

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
MIN_TIME, MIN_DISTANCE, locationListener); 

다음 호출하여 위치 업데이트를 요청하는 것입니다, 당신은 수동으로 onLocationChange 전화, 오히려 MIN_TIME 및 MIN_DISTANCE가있는 경우 공급자가 리스너를 호출하지 않습니다 초과되었습니다.

  • 위치가 변경되지 않으면 onLocationChanged()가 호출되지 않습니다. onLocationChanged를 호출하지 않고 일정 기간이 지나면 마지막으로 알고있는 위치가 가장 정확하다고 가정 할 수 있습니다.

  • 또한 공급자가 사용자 위치에 대한 수정 사항을 얻을 수 없기 때문에 onLocationChanged()가 호출되지 않을 가능성이 있습니다. 이 경우, 선택적으로, 다른 그들이`getLastKnownLocation()가`부정확 한 결과를 반환 할 수 어딘가에 마지막으로 알려진 위치에 다시

관련 문제