Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-重复相同的GPS位置,无需更新_Android_Gps_Location_Locationmanager - Fatal编程技术网

Android-重复相同的GPS位置,无需更新

Android-重复相同的GPS位置,无需更新,android,gps,location,locationmanager,Android,Gps,Location,Locationmanager,在这里发布之前,我已经试着做了关于GPS问题的研究。当我测试代码时,它一遍又一遍地重复相同的输出。在计时器上调用方法gpsStart()。精细和粗略位置权限已添加到清单中。方法appendLog()将输出存储在文件中 public void gpsStart() { // Acquire a reference to the system Location Manager LocationManager locationManager = (LocationMan

在这里发布之前,我已经试着做了关于GPS问题的研究。当我测试代码时,它一遍又一遍地重复相同的输出。在计时器上调用方法
gpsStart()
。精细和粗略位置权限已添加到清单中。方法
appendLog()
将输出存储在文件中

public void gpsStart() {
        // Acquire a reference to the system Location Manager
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        // Define a listener that responds to location updates
        LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // Toast.makeText(getApplicationContext(), "location changed",
                // Toast.LENGTH_SHORT).show();
                // Called when a new location is found by the network location
                // provider.
                appendLog("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude()+"\n");
                text3.setText("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude());
            }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    };

    // Register the listener with the Location Manager to receive location
    // updates
    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}

最好创建两个侦听器。一个用于Gps,另一个用于网络

下面是代码示例

public class MyLocationListener extends LocationListener  
{
            public void onLocationChanged(Location location) 
           {
                // Toast.makeText(getApplicationContext(), "location changed",
                // Toast.LENGTH_SHORT).show();
                // Called when a new location is found by the network location
                // provider.
                appendLog("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude()+"\n");
                text3.setText("Lat: " + location.getLatitude() + "\nLng: "
                        + location.getLongitude());
            }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    }

MyLocationListener gpsListener=new MyLocationListener();
MyLocationListener networkListener=new MyLocationListener();

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpslocationListener);    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networklocationListener);

您不能在计时器中调用
gpsStart()
方法。我要说的是位置侦听器是如何工作的

什么是位置侦听器

Location Listener是当您的当前位置将被更改时通知您的类。要接收位置更新,必须使用LocationManager类注册LocationListener类

何时注册位置侦听器

这取决于您的应用程序的要求。例如,如果您希望位置侦听器在地图上显示当前位置,则应在活动的
onCreate()
onResume()
方法中注册位置侦听器,并在
onPause()
onStop()
方法中注销接收器。如果您希望在应用程序未运行的情况下接收位置,则可以使用服务接收位置

如何注册/取消注册位置侦听器

要注册LocationListener,首先需要LocationManager类的实例,您可以使用如下上下文获得该实例

LocationManager LocationManager=(LocationManager)context.getSystemService(context.LOCATION\u服务)

然后,您必须设置位置提供程序。有两种类型的提供者经常使用

  • 全球定位系统供应商
  • 网络供应商
  • 现在,要向该位置提供程序注册位置接收器,可以使用LocationManager的方法
    requestLocationUpdates
    。在这个方法中,第一个参数是提供者名称,第二个参数是请求位置更新的最短时间。第三个参数是请求位置更改的最小距离。最后一个参数是locationListener。 下面是如何使用该方法

    locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener);
    locationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, minTime, minDistance, locationListener);
    
    要注销位置更新,可以使用以下方法

    locationManager.removeUpdates(locationListener)
    
    注意:正如您在问题中提到的,您正在计时器中调用一个方法
    gpsStart
    ,因此每次该方法调用时,它都会添加位置侦听器。因此,所有侦听器都会触发您的新位置,因此您可能多次获得相同的位置。相反,您应该在活动开始时调用此方法一次,并在活动结束时注销此locationListener

    希望你能得到D


    享受

    非常感谢您的回答。Dharmendra你是对的,我确实需要关闭LocationListeners,但是我的问题的答案要简单得多。我需要将最短时间(侦听器等待得到答案的时间)更改为大于零的值。我需要更改的值在下面以粗体显示(MINTIME)


    是的,我现在也有同样的问题。
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINTIME, 0, gpslocationListener);        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MINTIME, 0, networklocationListener);