2016-04-25 93 views
1

我对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 

} 

} 

道歉穷人格式。任何帮助将不胜感激。

回答

2

解决:

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); 

要从非活动类需要下面的代码检索上下文

感谢您的帮助。显示java.lang.NullPointerException:试图调用虚拟方法java.lang.String中android.content.Context

get Context in non-Activity class

0

您不能使用应用程序上下文来启动应用程序。你应该使用活动上下文。如果(猜测)地图是那么你的活动更新开始活动代码

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

详情为什么应用程序上下文不能使用启动活动https://possiblemobile.com/2013/06/context/

+0

我做你的建议得到了下面的错误。getPackageName()'的空对象引用 – pwhc

0

从我的角度来看,你有两个选择,以获得它:

  1. CustomLocationListener声明为private,例如NameOfYourActivity

接下来,将Intent构造函数从getApplicationContext()更改为NameOfYourActivity.this

  • 设置NameOfYourActivity作为CustomLocationListener属性的Context,然后从getApplicationContext()Intent构造改变到上下文属性。
  • 希望它可以帮助

    0

    你得到空,因为你的类没有扩展的Android活动。您可以像解释here一样获取非活动类中的应用程序上下文。

    +0

    我使用了下面的代码,即时通讯不知道如果我做的是正确的:'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()对一个空对象**错误 – pwhc

    相关问题