代码之家  ›  专栏  ›  技术社区  ›  w2lame

基于GPS的Android应用程序中的NullPointerException

  •  3
  • w2lame  · 技术社区  · 14 年前

    我有一个非常简单的类,它查找最后一个已知的用户坐标,然后打印其中一个。但我将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();
            }
        }
    }
    

    运行完窗口后,我会执行以下操作: 转到Eclipse中的DDMS并设置晶格/长震级,然后单击send。

    它仍然不会在函数中启动任何toast命令。

    4 回复  |  直到 12 年前
        1
  •  0
  •   Shardul    14 年前

    你可以做空检查,这绝对是解决这个问题的好方法。另一个技巧是在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的Emulator控件弹出按钮执行此操作。在启动活动之前,请修复一些经度和纬度值。

    希望这有帮助!

        2
  •  1
  •   usr-local-ΕΨΗΕΛΩΝ    14 年前

    如果你读了 manual ,显式地说,该方法返回“提供者的最后一个已知位置,或null”。

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

    希望能有所帮助。

        3
  •  1
  •   WarrenFaith    14 年前

    有道理。。。因为如果设备没有一个已知的位置,你就找不到。 你应该自己处理空值。提供新位置或等待第一个GPS数据。。。

        4
  •  1
  •   Octavian Helm    14 年前

    沃伦菲思和德切隆所说的的确是一个很好的做法。在使用该对象之前,您应该检查它是否为空。

    还可以考虑,如果您在活动中,则不需要真正调用上下文 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();
    }