GPS代码返回最后位置

时间:2014-09-11 08:39:51

标签: android android-asynctask gps

我想要做的就是在进入下一个活动之前使用GPS获取当前位置。所以我禁用了将我带到下一个活动的按钮。只有在使用GPS获取位置后才能启用这些按钮。以下代码运行完美。但我发现了一个错误..

上次我使用该应用程序时,它非常正确。然后我搬到了我的大学。在那里,我启动了应用程序,然后移动到下一个活动,因为当时检索了位置。我得到了我家的位置,距离大约10公里。关闭应用程序后,我再次启动它,这次它检索到了正确的位置。

嗯,这是因为以下几行:

        location = locationManagerAsync.getLastKnownLocation(providerAsync);

我的应用正在检索最后一个位置并启用按钮。但它能够在下次启动应用程序时保留当前位置。结果,在第二次尝试时,完美地检索位置。

我在stackoverflow.com上使用了一个问题的代码,如下所示。

private class MyLocationTracker extends AsyncTask<Void, Void, Void> implements LocationListener {

    private Context ContextAsync;
    public MyLocationTracker (Context context){
        this.ContextAsync = context;
    }

    Dialog progress;
    private String providerAsync;
    private LocationManager locationManagerAsync;  
    double latAsync=0.0;
    double lonAsync=0.0;
    Location location;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progress = ProgressDialog.show(ContextAsync, "Loading location", "Please wait...");
    }


    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        locationManagerAsync = (LocationManager) ContextAsync.getSystemService(ContextAsync.LOCATION_SERVICE);

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
        providerAsync = locationManagerAsync.getBestProvider(criteria, false);


        if (locationManagerAsync.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            providerAsync = LocationManager.GPS_PROVIDER;
        } else if (locationManagerAsync.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            providerAsync = LocationManager.NETWORK_PROVIDER;

        } else if (locationManagerAsync.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) {
            providerAsync = LocationManager.PASSIVE_PROVIDER;
            //Toast.makeText(ContextAsync, "Switch On Data Connection!!!!", Toast.LENGTH_LONG).show();
        }    

        location = locationManagerAsync.getLastKnownLocation(providerAsync);

        // Initialize the location fields
        if (location != null) {
            //  System.out.println("Provider " + provider + " has been selected.");
            latAsync = location.getLatitude();
            lonAsync = location.getLongitude();

        } else {
            //Toast.makeText(ContextAsync, " Location not available", Toast.LENGTH_SHORT).show();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {  

        super.onPostExecute(result);
        progress.dismiss();
        onLocationChanged(location);
        Log.v("latAsync_lonAsync",latAsync+"_"+lonAsync);

        myCurrentLatitude = latAsync;
        myCurrentLongitude = lonAsync;

        // the buttons that were disabled in the onCreate() method  
        police.setEnabled(true);
        medical.setEnabled(true);
         fireService.setEnabled(true);
        cityCorporation.setEnabled(true);
        telePhnCall.setEnabled(true);
        getRoute.setEnabled(true);          

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this);
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

}

这是我用来从Oncreate()方法调用AsyncTask的行。

    new MyLocationTracker(TypeOfEmergency.this).execute();

现在的问题是,我不希望检索最后一个位置并将其存储在变量中。我删除了行

后尝试了代码
    location = locationManagerAsync.getLastKnownLocation(providerAsync);

但在这种情况下应用程序崩溃了。需要快速解决。

这是错误日志::(在查看错误日志之前,请查看注释)

enter image description here

1 个答案:

答案 0 :(得分:0)

代码中的内容基本上是错误的:onLocationChanged

中的单行代码
locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this);

需要在doInBackground的末尾调用(不需要在后台完成)。该代码行从提供者(例如GPS提供者)请求位置更新。当新位置可用时,您的位置监听器的onLocationChanged会被调用(由于上面一行中的MyLocationTracker,您的示例中为thisonLocationChanged您需要getLastKnownLocation通过启用或禁用您在问题中提到的功能来对新位置做出反应。

对{{1}}的调用完全符合名称的含义:它返回最后一个已知的位置,这可能已经很久了。