NullPointerException в приложении Android, работающем на GPS - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть следующий очень простой класс, который ищет последние известные пользовательские координаты и затем печатает одну из них.Но я получаю loc как нулевую переменную.Приложение не считывает данные в переменную loc.

    import android.app.Activity;
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.widget.Toast;

    public class Navigation extends Activity
    {
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /* Use the LocationManager class to obtain GPS locations */
        try
        {
            LocationManager mlocManager = 
              (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Toast.makeText(getBaseContext(), 
                  "Provider Enable Status : " + mlocManager.isProviderEnabled(                       
                   mlocManager.getProvider("gps").getName()),     
                   Toast.LENGTH_LONG).show();

            Location loc = mlocManager.getLastKnownLocation("gps");
            Toast.makeText( getApplicationContext(), "" + 
                loc.getLatitude(),  Toast.LENGTH_LONG).show();
            Toast.makeText( getApplicationContext(), "" + loc,
                Toast.LENGTH_LONG).show();
         } catch (Exception e) {
           Toast.makeText(getBaseContext(), e.getMessage() + 
             e.toString(), Toast.LENGTH_LONG).show();
         }
      }
   }

Я добавил следующий слушатель к коду:

        LocationListener mlocListener = new MyLocationListener();

        mlocManager.requestLocationUpdates( mlocManager.getProvider("gps").getName(), 0, 0, mlocListener);

в функции oncreate.И следующее как класс в

public class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location loc) {
        Toast.makeText( getApplicationContext(),
            "Hi, location changed. :)", Toast.LENGTH_LONG).show();
        try {
        loc.getLatitude();
        loc.getLongitude();
        String Text = "My current location is: " +
                " Latitude = " + loc.getLatitude() +
                " Longitude = " + loc.getLongitude();
        Toast.makeText(getApplicationContext(),
                Text, Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), 
                e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

И после запуска окна я делаю следующее: перейдите в DDMS в Eclipse и установите широты / долготы и нажмите кнопку отправки.

Тем не менее в функции не запускается ни одна тост-команда.

Ответы [ 4 ]

1 голос
/ 12 ноября 2010

То, что сказали Уоррен Фэйт и Джечелон, действительно хорошая практика. Перед использованием этого объекта следует проверить, не является ли он нулевым.

Также учтите, что если вы находитесь внутри своей деятельности, то нет необходимости в том, чтобы контекст вызывал getApplication() и getBaseContext(). Замените их на this и попробуйте снова.

Возможно, вы также захотите проверить свое третье уведомление о тосте, поскольку вы устанавливаете его текст как ""+loc Полагаю, вы имели в виду ""+loc.getLongitude().

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

private Context ctx = null;

public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    // some code

    ctx = getApplication();

    // some more code

}

// your other class in the same Java file (inner class)

public class MyOtherClass {
    // a construtctor probably
    // some usefull methods
    Toast.makeText(ctx, "My message", 5000).show();
}
1 голос
/ 12 ноября 2010

Что имеет смысл ... потому что, если устройство никогда не имело известного местоположения, вы не можете его получить.Вы должны справиться с нулем самостоятельно.Укажите новое местоположение или дождитесь первых данных GPS ...

1 голос
/ 12 ноября 2010

Если вы прочитали руководство , прямо сказано, что метод возвращает «последнее известное местоположение для провайдера, или ноль».

Я не Android-разработчик, но япредположим, что он возвращает ноль при холодной загрузке GPS, пока не будет сделано исправление.Вы должны проверить, что loc это !=null, прежде чем продолжить.Вы можете попытаться подождать некоторое время или использовать асинхронный обратный вызов.

Надеюсь, что вам помогли.

0 голосов
/ 12 ноября 2010

Ну, вы можете сделать нулевую проверку, это абсолютно хороший подход к этой проблеме. Еще один трюк с этим - вызов функции onResume (), для которой вы запрашиваете обновления местоположения:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f,this);
    super.onResume();
}

В вашем случае mlocManager , убедитесь, что вы создали его как переменную экземпляра (на уровне класса), а не локально (не определено в методе, в вашем случае в onCreate).

Это, безусловно, будет получать обновления местоположения, а не выбрасывать нулевой указатель. Также убедитесь, что вы зафиксировали свой эмулятор с настройкой GPS . Используйте выпадающее меню DDMS Emulator Control для этого. исправьте некоторые значения долготы и широты, прежде чем начинать свою деятельность.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...