изключение за нулев указател при опит за стартиране на нова дейност

Аз съм доста нов в 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 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

получавате нула, защото вашият клас не разширява активността на 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