【问题标题】:Getting application crash when retrieving latitude and longitude检索纬度和经度时出现应用程序崩溃
【发布时间】:2012-08-01 11:12:10
【问题描述】:

您好,我目前正在尝试检索我当前的纬度和经度并将它们转换为地址,但是每次运行程序时都会出现应用程序崩溃。知道是什么原因造成的吗?

活动:

public class LocatahActivity extends Activity {

    LocationManager lm;
    String towers;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        towers = lm.getBestProvider(criteria, false);
        Location location = lm.getLastKnownLocation(towers);        

        //double lat = (location.getLatitude()*1E6);
        //double longi = (location.getLongitude()*1E6);

        double lat = location.getLatitude();
        double longi = location.getLongitude();

        Log.e("TAG", "Latitude: " + lat);
        Log.e("TAG", "Longitude: " + longi);

        TextView myLatitude = (TextView)findViewById(R.id.mylatitude);
        TextView myLongitude = (TextView)findViewById(R.id.mylongitude);
        TextView myAddress = (TextView)findViewById(R.id.myaddress);

        myLatitude.setText("Latitude: " + String.valueOf(lat));
        myLongitude.setText("Longitude: " + String.valueOf(longi));

        Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);

        try {
            List<Address> addresses = geocoder.getFromLocation(lat, longi, 1);
            StringBuilder sb = new StringBuilder();
            if (addresses.size() > 0) {
            Address address = addresses.get(0);
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
            sb.append(address.getAddressLine(i)).append("\n");
            sb.append(address.getLocality()).append("\n");
            sb.append(address.getPostalCode()).append("\n");
            sb.append(address.getCountryName());

            myAddress.setText(sb.toString());
            }
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            myAddress.setText("Cannont get Address!");
        }

    }


}

清单:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

Logcat

08-01 19:20:45.572: E/AndroidRuntime(6233): FATAL EXCEPTION: main
08-01 19:20:45.572: E/AndroidRuntime(6233): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.location/com.example.location.LocatahActivity}: java.lang.NullPointerException
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.os.Looper.loop(Looper.java:137)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread.main(ActivityThread.java:4511)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at java.lang.reflect.Method.invokeNative(Native Method)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at java.lang.reflect.Method.invoke(Method.java:511)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at dalvik.system.NativeStart.main(Native Method)
08-01 19:20:45.572: E/AndroidRuntime(6233): Caused by: java.lang.NullPointerException
08-01 19:20:45.572: E/AndroidRuntime(6233):     at com.example.location.LocatahActivity.onCreate(LocatahActivity.java:44)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.Activity.performCreate(Activity.java:4470)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
08-01 19:20:45.572: E/AndroidRuntime(6233):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
08-01 19:20:45.572: E/AndroidRuntime(6233):     ... 11 more

【问题讨论】:

  • 你也可以提供一个logcat吗?
  • 哎呀,抱歉忘记了logcat,已经更新了帖子
  • 不存在这样的方式。一种低效的方法是自己分析空引用的可能性,进行适当的更改并再次运行。顺便说一句,不通过 logcat 的确切原因是什么?
  • 我已经通过了 logcat,我知道有一个空指针异常,但我不知道它是什么,这就是我在这里问的原因?
  • 双纬度 = location.getLatitude();

标签: android gps location latitude-longitude


【解决方案1】:

您的 location 对象似乎为空。这可能在您使用getLastKnownLocation() 时发生。如果没有最后一个位置,或者如果提供程序当前被禁用,您将使用此方法获得 null。

除此之外,您说您想要当前位置。这是获取当前位置的错误方法。要获取用户的当前位置,您需要使用LocationManager API 中给出的 requestLocationUpdates() 方法。使用这些和LocationListener 接收更新。请记住,获得位置可能需要几秒钟到几分钟的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多