2 xiaoxiaoaishang xiaoxiaoaishang 于 2012.11.27 11:47 提问

Android GPS是返回过时的信息

在我现在的应用程序中,返回的位置信息是过时的。我使用一个方法来获得更新基于最小时间/更新之间的距离。然而,比方说,我把手机关掉,开车去另一个城市,然后把手机打开,在这种情况下我的GPS就会关闭。我怎么做才能让app获得当前的位置,而不是getLastKnownLocation()

我听说过locationListener,但是我获得信息关于怎么用它都很模糊
下边是我的代码,希望能对找到问题有点帮助:

public class GPSHandling extends Service implements LocationListener{

    private final Context myContext;

    //gps状态标记
    public boolean isGPSEnabled = false;

    //网络状态标记
    public boolean isNetworkEnabled = false;

    //用于决定是否我能通过网络或者是GPS获得位置
    public boolean canGetLocation = false;

    Location myloc;

    public double latitude;
    public double longitude;

    public int MIN_TIME_BTWN_UPDATE = 500*10;  
    public int MIN_DISTANCE_BTWN_UPDATE = 10;  
    protected LocationManager locManager;

    public GPSHandling(Context context){
        this.myContext= context;
        getLocation();
    }
    public Location getLocation(){
        try{
            locManager =(LocationManager) myContext.getSystemService(LOCATION_SERVICE);

            // 现在获得gps状态
            isGPSEnabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            //获得网络状态
            isNetworkEnabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled){
                (this.cangetlocation = false but its already set to that by default)
            }
            else{
                this.canGetLocation=true;
                //首先从网络提供商获得值给locManager,发给parameters告诉他们何时更新
                if(isNetworkEnabled){
                    locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BTWN_UPDATE, MIN_DISTANCE_BTWN_UPDATE, this);
                    Log.d("provider", "network");
                    //如果我们成功了,然后检查位置信息是不是空,试着从manager处获得当前位置信息
                    if (locManager != null){
                        myloc =locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            // 在得到当前的位置后,试着获得经纬度
                            if (myloc != null){
                                latitude = myloc.getLatitude();
                                longitude = myloc.getLongitude();
                                              }
                                           }
                                    }
                //现在从GPS提供商获得值给locManager,发给parameters告诉什么时候更新】
                if(isGPSEnabled){
                    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BTWN_UPDATE, MIN_DISTANCE_BTWN_UPDATE, this);
                    Log.d("provider", "GPS");
                }
                //如果我们成功了,然后检查位置信息是不是空,试着从manager处获得当前位置信息
                    if(locManager!= null){
                        myloc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    }
                    //在得到当前的位置后,试着获得经纬度
                        if(myloc != null){
                            latitude = myloc.getLatitude();
                            longitude = myloc.getLongitude();
                        }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return myloc;
    }
    //通过类方法获得当前纬度的数据
    public double getMyLatitude(){
        if (myloc!= null){
            latitude = myloc.getLatitude();
        }
        return latitude;
    }
    //通过类方法获得当前经度的数据
    public double getMyLongitude(){
        if (myloc != null ){
            longitude = myloc.getLongitude();
        }
        return longitude;
    }

    //用这个方法看app是否能获得当前的坐标
    public boolean canGetMyLocation(){
        return this.canGetLocation;
    }

    public void showGPSDialog(){
        AlertDialog.Builder alert = new AlertDialog.Builder(myContext);
        //设置Dialog Title 
        alert.setTitle("Location Setting");
        // 设置Dialog Message
        alert.setMessage("GPS is not enabled, do you want to enable this now in the settins menue?");

        //给dialog设置icon
        //alert.setIcon(R.drawable.)

        //当点击的时候设置按钮
        alert.setPositiveButton("Settins", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                myContext.startActivity(intent);
            }
        });
        //当点击的时候取消按钮
        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        //显示警告dialog
        alert.show();
    }

    public void stopUsingGPS(){
        if(locManager !=null){
            locManager.removeUpdates(GPSHandling.this);
        }
    }


    @Override
    public void onLocationChanged(Location location) {
        // TODO自动生成方法存根

    }

    @Override
    public void onProviderDisabled(String provider) {
        //  TODO自动生成方法存根

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO自动生成方法存根

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO自动生成方法存根

    }

    @Override
    public IBinder onBind(Intent intent) {
        //  TODO自动生成方法存根
        return null;
    }
}

1个回答

liangchichexin
liangchichexin   2012.11.27 13:33
已采纳

您已经在您的代码中使用了一部分的LocationListener了。你只是没有完全实现代码。
在你的代码中下边的这个是空的:

@Override
public void onLocationChanged(Location location) {
    // TODO自动生成方法存根

}

这个方法在每次GPS生成一个新的位置信息的时候都要调用的。
你应该把它完成的:

@Override
public void onLocationChanged(Location location) {
    latitude = location.getLatitude();
    longitude = location.getLongitude();
}

就是以上这些了

liangchichexin
liangchichexin 还要考虑到电池的问题,位置更新的太频繁会导致电池电量耗费过快,因为需要GPS不断的计算位置。如果距离较小的话是不影响电池的,因为GPS已经计算了这个位置了。
大约 5 年之前 回复
xiaoxiaoaishang
xiaoxiaoaishang android会不断得到GPS位置更新吗(我想知道android如何知道位置已经改变然后调用这个方法)?如果是这样我是不是得必须告诉它什么时候来更新位置信息?
大约 5 年之前 回复
liangchichexin
liangchichexin 在onLocationChange()你只能接收新(当前)的位置信息。如果你用getLastKnownLocation()你可以一直接收缓存的位置(可以是非常旧的或者是只是刚刚缓存的。)
大约 5 年之前 回复
xiaoxiaoaishang
xiaoxiaoaishang 谢谢,这个有考虑到以前的位置信息的缓存的情况么?
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!