在Android应用程序中使用GPS的NullPointerException

时间:2010-11-12 11:23:19

标签: android gps nullpointerexception

我有以下非常简单的类,它查找最后已知的用户坐标,然后打印其中一个。但我将loc作为null变量。应用程序不会将数据读入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();
        }
    }
}

运行窗口后,我执行以下操作: 转到Eclipse中的DDMS并设置lattitude / longtitude并单击send。

仍然不会在函数中触发任何toast命令。

4 个答案:

答案 0 :(得分:1)

如果您阅读manual,则明确表示该方法返回“提供者的最后一个已知位置,或者为null”。

我不是Android开发人员,但我猜它会在GPS冷启动时返回null,直到修复完毕。在继续之前,您必须检查loc是!=null。您可能会尝试等待一段时间或使用异步回调。

希望得到帮助。

答案 1 :(得分:1)

这是有道理的......因为如果设备从未有过已知的位置,那么你就无法得到一个。 你应该自己处理null。提供新位置或等待第一个GPS数据......

答案 2 :(得分:1)

WarrenFaith和djechelon说的确是一种很好的做法。在使用该对象之前,您应该检查它是否为空。

另外请注意,如果您在活动中,则无需让上下文调用getApplication()getBaseContext()。将其替换为this,然后重试。

您可能还想查看第三个Toast通知,因为您设置的文本为""+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();
}

答案 3 :(得分:0)

那么你可以做空检查,这绝对是解决这个问题的方法。另一个技巧是你的onResume()调用你请求位置更新的活动:

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

在您的情况 mlocManager 中,请确保将其创建为实例变量(类级别)而非本地(在onCreate的情况下未在方法中定义)。

这肯定会获取位置更新而不会抛出空指针。另外,请确保 geofix您的GPS配置模拟器。使用DDMS的仿真器控件弹出按钮来执行此操作。在启动活动之前修复一些经度和latitiude值。

希望这有帮助!