2011-08-01 6 views
0

버튼을 클릭 할 때 사용자의 위치를 ​​얻으려고합니다.
위치 관리자 android problem

 

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
bestProvider = locationManager.getBestProvider(criteria, false); 
Location currentLocation = locationManager.getLastKnownLocation(bestProvider); 
Log.e(tag,"reached till here"); 
location = Double.toString(currentLocation.getLatitude()) + " " + Double.toString(currentLocation.getLongitude()); 
Toast.makeText(getApplicationContext(), location, Toast.LENGTH_LONG); 
MyLocation.setText(location); 
 

내가 로그 캣에 출력 reached till here을 얻고있다 :
나는 나의 버튼에 다음 코드는 리스너를 onclick을했다. 그 후 응용 프로그램이 중지되고 강제로 닫으라는 메시지가 표시됩니다. 처음에 몇 가지 검색을 수행하여 getLatitude 및 getLongitude가 double 값을 반환한다는 것을 알았습니다. 그래서 코드를 수정했습니다. 하지만 여전히 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 : 로그 캣 오류 : 796 UID 10036
을 PID하는
있어 RemoteException을 보내는 setActive (false)를 통지 내가 currentLocation가 반환 생각 널

+0

디버깅 및 개체 "currentLocation는"null의 경우 볼 수 있습니까? 또한 logcat에서 얻은 오류는 무엇입니까? – Finuka

+0

logcat을 게시하여 충돌하는 이유를 찾습니다. – PravinCG

+0

로그를 보여주십시오. 마지막으로 알려진 위치가 없을 수도 있습니다. 그렇다면 null이 생깁니다. – TofferJ

답변

3

당신이 Emulator 당신 아마 당신의 응용 프로그램을 테스트하는 경우 제공자가 없으므로 currentLocation 개체가 null이고 그 때문에 getLatitude()getLongitude()이 NPE를 제공합니다.

편집 : @grinnner가 말했듯이 DDMS 관점에서 위치 좌표 전송을 시뮬레이션 할 수 있습니다. 이클립스에서 DDMS Perspective를 열고 LocationControls 탭에서 경도와 위도를 설정 한 다음 보내기를 클릭하십시오. 장치 탭의 포커스가 앱을 실행하는 에뮬레이터에 있는지 확인하십시오.

+0

그는 Eclipse를 사용하는 경우 DDMS 관점에서 위치를 스푸핑 할 수 있습니다. – thegrinner

+0

에뮬레이터를 사용하는 경우 공급자를 얻는 방법을 알려주시겠습니까? – Brahadeesh

+0

@thegrinner 나는 그것을 어떻게하는지 모른다. 단계를 설명해 주시겠습니까? – Brahadeesh

1

마지막으로 알려진 위치가없는 경우 (반환 된 값에 대해 간단한 null 확인 만 수행) 위치를 얻으려면 위치 수신기를 추가해야합니다. 이런 식으로 뭔가 :

// Start listening for a new location. 
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
String bestProvider = lm.getBestProvider(new Criteria(), true);  
mMyLocationListener = new MyLocationListener(); 
lm.requestLocationUpdates(bestProvider, 0, 0, mMyLocationListener); 

private class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     // Do what you need to do with the longitude and latitude here. 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
} 

또한 바로 당신이 더 이상 필요하지 위치 수신기를 제거해야한다 : 당신이

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
lm.removeUpdates(mMyLocationListener); 
mMyLocationListener = null; 
+0

위치 업데이트를 원하지 않습니다. 나는 그 위치를 한 번 찾고 싶다. 이 코드는 위치 수신기를 구현하는 클래스 안에 있습니다. – Brahadeesh

+0

위치를 한 번만 원한다고해도, 마지막으로 알려진 위치가없는 경우이 위치를 얻는 유일한 방법이라고 생각합니다. 청취자를 등록하고 업데이트를받는 즉시 청취자를 제거하고 얻은 위치를 사용하십시오. 그러나 에뮬레이터가 문제를 제공하지 않는다면 Ovidiu의 대답을 참조하십시오. :) – TofferJ

+0

예. 그의 대답에 대한 마지막 코멘트를 확인하십시오. 그래도 고마워. – Brahadeesh