禁用 GPS 的位置更新
Posted
技术标签:
【中文标题】禁用 GPS 的位置更新【英文标题】:Disable location updates from GPS 【发布时间】:2015-12-18 11:23:50 【问题描述】:更新的问题 - 仍然无法正常工作
我已经更改了代码。
现在,deactivateAlerts 和 activateAlerts 在 MainActivity 中。
现在,在 activateAlerts() 中,我正在为 GPS Provider 实例化一个 GPSListener:
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
gpsListener = new GPSListener(getApplicationContext());
else if
GPSListener 在哪里:
public class GPSListener implements LocationListener
private Context mCtx;
private Location cLoc;
private LocationManager mLocMan;
public GPSListener (Context ctx)
mCtx = ctx;
mLocMan = (LocationManager) mCtx.getSystemService(Context.LOCATION_SERVICE);
mLocMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
public Location getLocation()
cLoc = mLocMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
return cLoc;
public void stop()
mLocMan.removeUpdates(GPSListener.this);
@Override
public void onLocationChanged(Location location)
Log.i("UPDATING", "updating location");
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public void onProviderEnabled(String provider)
@Override
public void onProviderDisabled(String provider)
使用 deactiveAlerts() 函数,我执行删除 GPS 更新的指令:
if(gpsListener!=null)
gpsListener.stop();
但是 GPS 还没有停止 =(
现在有什么问题?
原始问题
用户可以激活或停用位置更新。
如果位置更新被激活,它工作正常,但是当位置更新被禁用时,GPS仍在等待更新(并且图标出现在操作栏上)。
代码是这样的:
public class Alerts extends Fragment
MyLocationListener myLocationListener = null;
...
public void activateAlerts()
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
myLocationListener = new MyLocationListener();
getActivity().runOnUiThread(new Runnable()
@Override
public void run()
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
Utils.MINIMUM_TIME_BETWEEN_UPDATE,
Utils.MINIMUM_DISTANCECHANGE_FOR_UPDATE,
myLocationListener
);
else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
Utils.MINIMUM_TIME_BETWEEN_UPDATE,
Utils.MINIMUM_DISTANCECHANGE_FOR_UPDATE,
myLocationListener
);
else
locationManager.requestLocationUpdates(
LocationManager.PASSIVE_PROVIDER,
Utils.MINIMUM_TIME_BETWEEN_UPDATE,
Utils.MINIMUM_DISTANCECHANGE_FOR_UPDATE,
myLocationListener
);
);
...
public void deactivateAlerts()
...
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
if(myLocationListener != null)
locationManager.removeUpdates(myLocationListener);
myLocationListener = null;
...
public class MyLocationListener implements android.location.LocationListener
public void onLocationChanged(Location location)
Log.i("UPDATING", "updating location");
public void onStatusChanged(String s, int i, Bundle b)
Log.v("LocationListener", "onStatusChanged");
public void onProviderDisabled(String s)
Log.v("LocationListener", "onProviderDisabled");
public void onProviderEnabled(String s)
Log.v("LocationListener", "onProviderEnabled");
有什么问题?
我读过这篇文章:
Post1
Post2
Post3
Post4
【问题讨论】:
【参考方案1】:编辑:
这可能是您的错误;在下面的代码中,您可以看到我仅在 location == null
时检索更新。您需要仔细查看我发布的 getLocation()
函数代码,它类似于您的 activateAlerts()
函数。您需要实现我拥有的所有功能,包括 Location 成员。
if (isGPSEnabled)
if (location == null)
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_UPDATE,MIN_DISTANCE, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null)
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
Geocoder geocoder = new Geocoder(this,Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses != null)
setProvState(addresses.get(0).getAdminArea());
整个getLocation()方法如下:
// returns the location as longitude and latitude
public void getLocation()
try
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
// First get location from Network Provider
if (isNetworkEnabled)
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, MIN_UPDATE,
MIN_DISTANCE, this);
Log.d("Network", "Network");
if (locationManager != null)
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
Geocoder geocoder = new Geocoder(this,
Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(
latitude, longitude, 1);
if (addresses != null)
setProvState(addresses.get(0).getAdminArea());
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
if (location == null)
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, MIN_UPDATE,
MIN_DISTANCE, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null)
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
latitude = location.getLatitude();
longitude = location.getLongitude();
Geocoder geocoder = new Geocoder(this,
Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(
latitude, longitude, 1);
if (addresses != null)
setProvState(addresses.get(0).getAdminArea());
catch (Exception e)
e.printStackTrace();
【讨论】:
感谢您的回答!但是,用户有一个调用 activaAlerts() 或 deactivateAlerts() 的开关。那么,if/else-if/else 循环并不总是被执行,那么为什么你认为问题出在这部分代码上呢?我稍后会测试你的代码 =) 谢谢你的帮助,真的 我修正了我的答案,我看错了函数。 我应该将这两个功能都移到服务中吗?还是只有在 GPS 可用时才启动 Service 并执行 GPS 的相关指令? 我已经更新了代码,但是还不行.. =(我已经发布了新代码 我正在筛选您所做的事情,我认为您在实施我的建议时可能犯了一个错误,一旦确定您的错误,我将使用经过审核的解决方案更新我的答案。以上是关于禁用 GPS 的位置更新的主要内容,如果未能解决你的问题,请参考以下文章