исключение нулевого указателя при попытке начать новую активность

Я новичок в java и android studio. Я пытаюсь запустить новую активность, когда пользователь находится на определенном расстоянии от указанной точки на карте.

Следующий класс определяет расстояние пользователя от каждой точки, когда пользователь находится на определенном расстоянии (10 м). Я хочу, чтобы было запущено новое действие, в котором пользователь сможет ответить на вопрос в зависимости от местоположения.

Однако, когда я пытаюсь начать новую деятельность, я получаю сообщение об ошибке:

E/AndroidRuntime: FATAL EXCEPTION: main

Process: uk.ac.ucl.cege.cegeg077.ucfapwh.firstapp, PID: 6616
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
    at uk.ac.ucl.cege.cegeg077.ucfapwh.firstapp.CustomLocationListener.onLocationChanged(CustomLocationListener.java:67)
    at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:281)
    at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:210)
    at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:226)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

Вот код, который у меня есть до сих пор:

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class CustomLocationListener extends Map implements LocationListener {
public Map parentActivity ;
public ArrayList<GeoPoint> coordList;
// this method is called every time the user moves around - i.e. changes     location
// it pops up a toast message with the new coordinates
public void onLocationChanged(Location location) {

    // now measure distance from all the pre-set proximity alerts
    for (int i = 0; i < coordList.size(); i++) {

        // create GeoPoint object for each pair of coordinates
        GeoPoint gp = coordList.get(i);

        // create Location object
        Location fixedLoc = new Location("one");

        // get lat and lng values from GeoPoint object
        Float lat = Float.valueOf(String.valueOf(gp.getLatitude()));
        Float lng = Float.valueOf(String.valueOf(gp.getLongitude()));

        // set location for proximity alert
        fixedLoc.setLatitude(lat);
        fixedLoc.setLongitude(lng);

        // use Android distanceTo function to calculate the distances
        float distance = location.distanceTo(fixedLoc);

        Log.i("****DISTANCE****",String.valueOf(distance));
        Log.i("*****FIXEDLOC****", fixedLoc.toString());

        for (int j = 0; j < coordList.size(); j++ ) {

            if (i == j && distance < 120) {

                GeoPoint geoPoint = coordList.get(j);

                Log.i("****PROXI LAT*****", geoPoint.getLatitude().toString());
                Log.i("****PROXI LNG****", geoPoint.getLongitude().toString());

                Intent quizIntent = new Intent(getApplicationContext(),Questions.class);
                startActivity(quizIntent);

            }
        }

    }

}

// these methods are called when the GPS is switched on or off
// and will allow the App to warn the user and then
// shut down without an error
public void onProviderDisabled(String s) {
}
public void onProviderEnabled(String s) {
}

// this method is required by the LocationListener
// we do not need to do anything here
// but in a full implementation this could be used to react when the GPS signal is not available
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}

}

Извиняюсь за плохое оформление. Любая помощь будет принята с благодарностью.


person pwhc    schedule 25.04.2016    source источник


Ответы (4)


Решено:

Чтобы получить контекст из класса без активности, необходим следующий код:

private Context context;

public NonActivityClass(Context context) {
    this.context = context.getApplicationContext();
}

Затем, чтобы запустить Intent и начать новую активность:

                Intent i = new Intent(context, Activity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);

Спасибо за помощь.

получить контекст в классе без активности

person pwhc    schedule 26.04.2016

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

Intent quizIntent = new Intent(this,Questions.class);
                startActivity(quizIntent);

Подробнее о том, почему нельзя использовать контекст приложения для запуска активности, https://possiblemobile.com/2013/06/context/

person USKMobility    schedule 25.04.2016
comment
Я получаю следующую ошибку, делая то, что вы предложили: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.content.Context.getPackageName()' для нулевой ссылки на объект - person pwhc; 26.04.2016

С моей точки зрения, у вас есть два варианта его получения:

  1. Объявите CustomLocationListener как частный внутри, скажем, NameOfYourActivity .

Затем измените конструктор Intent с getApplicationContext() на NameOfYourActivity.this.

  1. Установите Context из NameOfYourActivity как свойство в CustomLocationListener, а затем измените конструктор Intent с getApplicationContext() на свойство контекста.

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

person jos    schedule 25.04.2016

вы получаете null, потому что ваш класс не расширяет активность Android. вы можете получить контекст приложения в классе без активности, как описано здесь.

person Zeeshan Bin Iqbal    schedule 25.04.2016
comment
Я использовал следующий код, я не уверен, правильно ли я делаю: public Context context; public CustomLocationListener(Context context) { this.context=context; }. Затем я объявил новый экземпляр со следующим: Intent quizIntent = new Intent(new CustomLocationListener(this),Questions.class). Однако я получил то же самое java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.content.Context.getPackageName() для нулевого объекта. - person pwhc; 26.04.2016