2013-07-25 11 views
6

Mam ten kod, którego używam do pozycjonowania aplikacji mapy. Przetestowałem go w urządzeniu Galaxy S2 i działa dobrze, ale kiedy testowałem go w urządzeniu nexus 4, wywołanie zwrotne onLocationChanged nigdy nie jest wywoływane. Co mogłem robić źle?LocationClient requestUpdates onLocationChanged nigdy nie było nazywane

Oto mój kod działalność:

public class BaseMapActivity extends FragmentActivity implements Injectable, 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { 

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 

    private MapEntity component; 
    private boolean yetStarted = false; 

    private LocationClient mLocationClient; 
    private LocationRequest mLocationRequest; 
    private Location location; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.map_activity); 
     mLocationClient = new LocationClient(this, this, this); 
     mLocationRequest = LocationRequest.create(); 

     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // TODO 
     mLocationRequest.setInterval(5000); // TODO 
     mLocationRequest.setFastestInterval(5000); // TODO 

     replaceFragment(R.id.map_container, mapFragment); 

     // Agrega el fragment de extras 
     Fragment extrasFragment = component.getExtrasFragment(); 
     replaceFragment(R.id.map_extras, extrasFragment); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

      mLocationClient.connect(); 
    } 

    @Override 
    protected void onStop() { 

     if (mLocationClient.isConnected()) { 
      mLocationClient.removeLocationUpdates(this); 
      mLocationClient.disconnect(); 
     } 

     super.onStop(); 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 

     mLocationClient.requestLocationUpdates(mLocationRequest, this); 
     location = mLocationClient.getLastLocation(); 

     if (location == null) { 
      return; 
     } 

     Toast.makeText(this, "onConnected", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onDisconnected() { 
     mLocationClient.removeLocationUpdates(this); 
     Toast.makeText(this, "onDisconnected. Please re-connect.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     component.setCenter(location); 
     String msg = "Updated Location: " 
       + Double.toString(location.getLatitude()) + "," 
       + Double.toString(location.getLongitude()); 
     Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     switch (requestCode) { 

     case CONNECTION_FAILURE_RESOLUTION_REQUEST: 

      switch (resultCode) { 
      case Activity.RESULT_OK: 
       break; 
      } 
     } 
    } 

    @SuppressLint("ShowToast") 
    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

     if (connectionResult.hasResolution()) { 
      try { 
       connectionResult.startResolutionForResult(this, 
         CONNECTION_FAILURE_RESOLUTION_REQUEST); 
      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Toast.makeText(this, "An error ocurred getting current location", 
        Toast.LENGTH_SHORT); 
     } 

    } 

} 

Co dziwne jest to, że jego praca w jednym urządzeniu, ale nie w drugiej.

+1

Może to być problem z urządzeniem, może to być istotne http://stackoverflow.com/questions/9007600/onlocationchanged-callback-is-never-called – chancea

Odpowiedz

0

Spróbuj ustawić lokalizację, aby sprawdzić, czy wywołanie locationChange zostało wywołane, czy nie.

Oto przykład, który wykorzystałem do tego przed rozpoczęciem produkcji.

private Location createMockLocation() { 
    if (mockLocation == null) { 
     mockLocation = new Location("mock"); 
     mockLocation.setLatitude(41.4934133); 
     mockLocation.setLongitude(-23.8729252); 
     mockLocation.setAccuracy(1.0f); 
     mockLocation.setTime(new Date().getTime()); 
    } else { 
     mockLocation.setLatitude(mockLocation.getLatitude() + 0.00003); 
     mockLocation.setLongitude(mockLocation.getLongitude() + 0.00001); 
     mockLocation.setTime(new Date().getTime()); 
    } 
    return mockLocation; 
} 

private void mockLocation() { 
    LocationServices.FusedLocationApi.setMockMode(clientApi, true); 
    LocationServices.FusedLocationApi.setMockLocation(clientApi, createMockLocation()); 

    final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
    scheduler.scheduleAtFixedRate(new Runnable() { 
     public void run() { 
      LocationServices.FusedLocationApi.setMockLocation(clientApi, createMockLocation()); 
      // Log.d("MockLocation", 
      // "mockLocation: Lat:"+mockLocation.getLatitude()+" Long:"+mockLocation.getLongitude()); 
     } 
    }, 0, NORMAL_INTERVAL, TimeUnit.MILLISECONDS); 
} 

Dzięki tej metodzie otrzymujesz pozycję aktualizacji dla każdego NORMAL_INTERVAL w ms.

Mam nadzieję, że to pomoże :).

Powiązane problemy