在发布此处之前,我曾尝试对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);
}
答案 0 :(得分:3)
您不能在计时器中调用gpsStart()
方法。我将说明位置监听器如何工作
什么是位置监听器?
位置监听器是一个类,它会在您当前位置发生变化时通知您。要接收位置更新,您必须使用LocationManager类注册LocationListener类。
何时注册位置监听器?
这取决于您的申请的要求。例如,如果您希望位置监听器在地图上显示当前位置,那么您应该在活动的onCreate()
或onResume()
方法中注册位置监听器,并在onPause()
或onStop()
中取消注册接收器方法。如果您希望即使您的应用程序未运行也要接收该位置,那么您可以使用服务来接收位置。
如何注册/取消注册位置监听器?
要注册LocationListener,首先需要使用像
这样的上下文可以获得的LocationManager类的实例。 LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
之后您必须设置位置提供程序。通常使用两种类型的提供者。
现在,要使用此位置提供程序注册位置接收器,可以使用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
享受!!!
答案 1 :(得分:1)
最好为Gps和其他网络创建2个listeners.1。
以下是代码示例
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);
答案 2 :(得分:0)
非常感谢您的回答。 Dharmendra你是对的,我确实需要关闭LocationListeners,但我的问题的答案要简单得多。我需要将最小时间(听众等待获得答案的时间)更改为大于零的值。我需要更改的值在下面以粗体显示(MINTIME)。
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINTIME, 0, gpslocationListener); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MINTIME, 0, networklocationListener);