禁用 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 的位置更新的主要内容,如果未能解决你的问题,请参考以下文章

Google 地图 (Android) 中的位置更新率

如果 GPS 被禁用,位置将无法进入三星手机

禁用后虚假 GPS 位置仍然存在

使用 gps 捕获经纬度而不会耗尽电池电量

我无法获取 GPS 位置

从未调用过位置服务 onProviderEnabled