2015-01-28 5 views
0

Я пишу простое приложение для Android-навигации, которое в конечном итоге покажет прямолинейное расстояние между текущим местоположением пользователя и другим моментом, но я не могу получить GPS чтобы правильно работать. У меня есть Activity, который реализует LocationListener и обновляет пользовательский интерфейс в onLocationChanged(). Но как только я запускаю приложение на устройстве (через Android Studio), GPS получает исправление и отображает местоположение один раз, а затем никогда не обновляется после этого. Никогда. Даже когда я выхожу на улицу и гуляю. Когда я поворачиваю экран, заставляя Activity перерегистрироваться в качестве слушателя, я иногда вижу изменение в местоположении, но иногда я этого не делаю. Ввод дополнительного кода в onLocationChanged() показывает, что вызывается onLocationChanged(), но фактические данные местоположения вообще не меняются.Android onLocationChanged() получает обновления, но местоположение никогда не меняется

Кажется, что исправление за одну или две секунды заставило меня подумать, что это просто выплескивает место в кэше. Но иногда, при запуске приложения, я увижу пару секунд фактических обновлений с фактическими данными, прежде чем он перестанет обновляться. Кроме того, при подключении телефона к компьютеру я иногда вижу одно обновление. И это даже происходит, когда я выхожу на улицу, очищаю кешированные данные приложения в меню настроек системы и возвращаюсь в приложение. Там будет несколько обновлений, а затем он остановится в одном месте и откажется обновляться дальше.

Странная часть заключается в том, что она работала всего лишь два часа назад. Единственное, что я добавил в мой код с тех пор, это элементы пользовательского интерфейса.

Устройство, которое я использую, - это Nokia X2, поэтому переход на новый API сервисов Google Play не является вариантом. В журналах я вижу «D/ContextImpl: BYDSafe: новый BYDSafeLocationManager», когда я впервые получаю LocationManager. Googling для него абсолютно ничего не получается, поэтому я предполагаю, что это какой-то фирменный класс Nokia. Если этот класс является причиной моих проблем, то есть ли способ заставить Android дать мне фондовый Android LocationManager?

public class NavScreen extends Activity implements LocationListener { 

    private TextView latField; 
    private TextView longField; 
    private TextView altField; 
    private TextView beField; 
    private TextView spField; 
    private TextView luField; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_nav_screen); 

     latField = (TextView)(findViewById(R.id.latitudeField)); 
     longField = (TextView)(findViewById(R.id.longitudeField)); 
     altField = (TextView)(findViewById(R.id.altitudeField)); 
     beField = (TextView)(findViewById(R.id.bearingField)); 
     spField = (TextView)(findViewById(R.id.speedField)); 
     luField = (TextView)(findViewById(R.id.lastUpdateField)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.nav_screen, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     LocationManager manager = (LocationManager)(getSystemService(Context.LOCATION_SERVICE)); 
     if(manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
     { 
      manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 0, this); 
     } 
     else 
     { 
      Toast.makeText(this, "Please enable GPS", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
     LocationManager manager = (LocationManager)(getSystemService(Context.LOCATION_SERVICE)); 
     manager.removeUpdates(this); 
    } 

    //Location callbacks 

    @Override 
    public void onLocationChanged(Location location) { 
     String lat = String.format("%f", location.getLatitude()); 
     String lon = String.format("%f", location.getLongitude()); 
     String alt = String.format("%f", location.getAltitude()); 
     String bearing = String.format("%f", location.getBearing()); 
     String speed = String.format("%f", location.getSpeed()); 

     latField.setText("Latitude: " + lat); 
     longField.setText("Longitude: " + lon); 
     altField.setText("Altitude: " + alt + "m"); 
     beField.setText("Bearing: " + bearing + " degrees"); 
     spField.setText("Speed: " + speed + " m/s"); 
     luField.setText("Last update: " + new Date(System.currentTimeMillis()).toString()); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     switch(status) 
     { 
      case LocationProvider.OUT_OF_SERVICE: 
       Log.d("DEBUG", provider + " out of service"); 
       Toast.makeText(this, provider + " out of service", Toast.LENGTH_SHORT).show(); 
       break; 
      case LocationProvider.TEMPORARILY_UNAVAILABLE: 
       Log.d("DEBUG", provider + " temp. unavailable"); 
       Toast.makeText(this, provider + " temp. unavilable", Toast.LENGTH_SHORT).show(); 
       break; 
      case LocationProvider.AVAILABLE: 
       Log.d("DEBUG", provider + " available"); 
       Toast.makeText(this, provider + " available", Toast.LENGTH_SHORT).show(); 
       break; 
      default: 
     } 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     Toast.makeText(this, provider + " enabled", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     Toast.makeText(this, provider + " disabled", Toast.LENGTH_SHORT).show(); 
    } 
} 

ответ

0

При первом взгляде ваш код выглядит правильно. Я предлагаю проверить две вещи.

  1. регистратор прослушиваний во всех случаях, если не включен положительный результат проверки. Это делает вас уверенным, что вы будете слушать обновления независимо от того, что происходит на устройстве (например, пользователь может включить провайдера любым сторонним приложением на фоне)

  2. попытайтесь изменить параметр времени в manager.requestLocationUpdates также на 0. Я помню, что у меня также были некоторые проблемы с этим, и 0, 0 значения были лучшими в конце.

Надеется, что это помогает

0

Вы должны начать все ваши необходимые компоненты в onCreate() методы, когда extendsActivity.

В вашем случае вы инициировали все TextView, за исключением LocationManager.

Просто добавьте следующий код внутри метода onCreate().

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    ... 
    LocationManger l = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    //time interval needs to be multiplied by 1000 as millisecond is the actual unit. 
    l.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1*1000, 0, this); 
    this.onLocationChanged(null);//It is now initiated whenever app started 
} 

Или вы можете объявить LocationManager вне onCreate() как ваш TextView в случае, если необходимо развернуть его в любом месте (и т.д. внутри onResume).

Смежные вопросы