2013-08-05 1 views
1

내 위치 클래스가 있습니다. 나는 내 클래스를 사용하여 GPS 위치를 검색 할 때 0, 0을 얻는다는 확률 결과가 있습니다.Android 위치가 반환되지 않음 맞춤 클래스에서 위치

내가 GPS에 대한 위치 관리자에서 getLastKnown 기능을 검색 할 경우 반면에, 내가 강제 값을 얻을 :

public Location getGPSloc(Context c){ 
    isGPSavailable(c); 
    if(gps_enabled) 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListenerGps); 
    timerGPS = new Timer(); 
    timerGPS.schedule(new GetLastLocationGPS(), 45000); 
    return gpsLoc; 
} 

이 내가 함수 외부에서 전화하는거야 클래스입니다, 나는 this.getApplicationContext를 사용하고()를 누르십시오. 내가 있고, 내가 MyLocationInstance.getGPSloc를 호출 할 때

LocationListener locationListenerGps = new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) { 
     timerGPS.cancel(); 
     gpsLoc = location; 
     lm.removeUpdates(this); 
    } 
    @Override 
    public void onProviderDisabled(String provider) {} 
    @Override 
    public void onProviderEnabled(String provider) {} 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; 

이 (this.getApplicationContext()) 반환 값이 항상 0입니다 0 : 여기에

class GetLastLocationGPS extends TimerTask { 
    @Override 
    public void run() { 
     lm.removeUpdates(locationListenerGps); 
     if(gps_enabled){ 
      gpsLoc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);} 
     else{ 
      gpsLoc = null; 
     } 

    } 
} 

청취자입니다 :이 GetLastLocationGPS()이다 에뮬레이터로 보낸 83 43의 강제 값으로, LocationManagerInstance.getLastKnownLocation (LM.GPS)에 하위로 있으면 나타납니다.

이 방법으로 위치를 가져 오지 않는 이유는 알 수 없습니다.

이론상 통화가 발생하면 타이머가 계속 실행되고 있습니까? 그것이 내가 대답을 내놓을 수있는 유일한 방법이다. 다른 아이디어?

+0

업데이트. gpsLoc가 새 위치에 대한 요청이 시작되기 전에 GPS 제공 업체의 getLastKnownLocation으로 정의되도록 코드를 변경했습니다. 마지막으로 알려진 값의 값을 반환합니다. 이제는 GPSLoc가 새로운 위치에 대한 검색을 수행 할 때까지 onCreate 메소드를 계속 유지하기 위해 UI 스레드에 대한 요청을 묶고 싶지만 생각합니다. – user2097211

답변

0

나는 당신의 문제가 무엇인지 모르겠지만 이것이 내 부하이며 완벽하게 기능하는 코드입니다.

이 클래스는 조각에서 확장되므로 조각의 부모 역할을 할 수 있습니다. 각 간격 후에 클래스가 새 위치를 가져올 수있는 리스너가 있습니다.

public class LocationFinderFragment extends Fragment implements 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener { 

    public interface OnNewLocationFoundListener { 
     public void OnNewLocationFound(Location location); 
    } 

    private static final String TAG = "LocationFinderFragment"; 
    private static final long DEFAULT_UPDATE_LOCATION_INTERVAL = 30 * 1000; // update every 30 seconds 
    private static final long DEFAULT_TERMINATE_SAT_FINDING = 1 * 60 * 60 * 1000; // for 1 hour 

    private OnNewLocationFoundListener listener; // Listener of fragments 
    private OnNewLocationFoundListener listener2; // Listener of MainFragmentHolder 
    private Context context; 
    private LocationClient mLocationClient; 
    private static double lat = 0; 
    private static double lng = 0; 
    private static long lastTime = 0; 

    private LocationListener mLocationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      if(location == null) 
       return; 

      if(lat == location.getLatitude() && lng == location.getLongitude()) { 
       Log.e(TAG, "location not changed."); 
       return; 
      } 

      lat = location.getLatitude(); 
      lng = location.getLongitude(); 
      Log.i(TAG, "Location changed to (" + lat + ", " + lng + ")"); 

      // Ask fragment to get new data and update screen 
      listener.OnNewLocationFound(location); 

      // Display toast notification every minute (instead of every 30 seconds) 
      DateTime time = new DateTime(); 
      long currentTime = time.getMillis(); 
      if(currentTime > lastTime + 1 * 60 * 1000) { 
       listener2.OnNewLocationFound(location); 
       lastTime = currentTime; 
      } 
     } 
    }; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     try { 
      listener2 = (OnNewLocationFoundListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement OnNewLocationFoundListener interface."); 
     } 

     Log.i(TAG, "Fragment attached to activity."); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Getting context 
     context = getActivity().getApplicationContext(); 

     // Get location manager 
     mLocationClient = new LocationClient(context, this, this); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     // Get location 
     if(mLocationClient != null) 
      mLocationClient.connect(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     // remove listener in order to save resource 
     if(mLocationClient != null) 
      mLocationClient.disconnect(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     // remove listener in order to save resource 
     if(mLocationClient != null) 
      mLocationClient.disconnect(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Log.i(TAG, "Location Connected."); 
     // Get last known location 
     Location lastLocation = mLocationClient.getLastLocation(); 
     mLocationListener.onLocationChanged(lastLocation); 

     if(!SpGodMode.isLocationModeEnabled(context)) { 
      // Create location request 
      LocationRequest locationRequest = LocationRequest.create() 
        .setInterval(DEFAULT_UPDATE_LOCATION_INTERVAL) 
        .setExpirationDuration(DEFAULT_TERMINATE_SAT_FINDING) 
        .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
      mLocationClient.requestLocationUpdates(locationRequest, mLocationListener); 
     } else { 
      String strLoc = SpGodMode.getLocation(context); 
      if(strLoc != null) { 
       String lat = strLoc.substring(0, strLoc.indexOf(",")); 
       String lng = strLoc.substring(strLoc.indexOf(",") + 1); 
       Location location = new Location(""); 
       try { 
        location.setLatitude(Double.parseDouble(lat)); 
        location.setLongitude(Double.parseDouble(lng)); 
        mLocationListener.onLocationChanged(location); 
       } catch (NumberFormatException e) { 
        Log.e(TAG, "Wrong lat/lng for parsing as Double."); 
        Toast.makeText(context, "Wrong lat/lng", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    } 

    @Override 
    public void onDisconnected() { 
     Log.i(TAG, "Location Disconnected."); 
     if(mLocationClient != null && mLocationClient.isConnected()) 
      mLocationClient.removeLocationUpdates(mLocationListener); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.e(TAG, "Connection failed listener."); 
    } 

    public void setLocationListener(OnNewLocationFoundListener listener) { 
     this.listener = listener; 
    } 

    public void disconnectLocation() { 
     mLocationClient.disconnect(); 
    } 
} 
+0

SpGodMode 클래스는 무엇입니까 ???? – DannyThunder

+0

@DannyThunder 혼란스럽게해서 유감스럽게 생각합니다. 테스트 목적으로 사용했던 설정 수업이었습니다. 테스터는 위치를 하드 코딩 할 수 있었고 앱은 GPS 또는 네트워크에서 위치를 읽는 대신이 위치를 기반으로 위치를 표시했습니다. 당신은 그 부분을 무시할 수 있습니다 ... – Hesam

+0

수입 명세서가 없습니까? – Gerry

관련 문제