【问题标题】:What do I see the GPS icon consistently?我一直看到 GPS 图标是什么?
【发布时间】:2020-07-21 02:05:01
【问题描述】:

我编写了自定义位置管理器,每 30 秒检查一次用户位置的更新。代码运行良好,即我正在用户位置接收更新。但问题是 GPS 图标始终在顶部的状态栏上可见。我猜它应该只在 30 秒内可见一次。这是正常的还是我做错了什么?

public volatile Double mLatitude = 0.0;
public volatile Double mLongitude = 0.0;

int minTime = 30000;
float minDistance = 0;
MyLocationListener myLocListener = new MyLocationListener();
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

Criteria criteria = new Criteria();
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setSpeedRequired(false);

String bestProvider = locationManager.getBestProvider(criteria, false);
locationManager.requestSingleUpdate(criteria, myLocListener, null);     
locationManager.requestLocationUpdates(bestProvider, minTime, minDistance, myLocListener);


private class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location loc)
        {
            if (loc != null) {
                //Do something knowing the location changed by the distance you requested
                mLatitude = loc.getLatitude();
                mLongitude = loc.getLongitude();
                Toast.makeText(mContext, "Location Changed! "+Double.toString(mLatitude)+" "+Double.toString(mLongitude), Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onProviderDisabled(String arg0)
        {
            //Do something here if you would like to know when the provider is disabled by the user
            Toast.makeText(mContext, "Provider Disabled! "+Double.toString(mLatitude)+" "+Double.toString(mLongitude), Toast.LENGTH_LONG).show();

        }

        @Override
        public void onProviderEnabled(String arg0)
        {
            //Do something here if you would like to know when the provider is enabled by the user
            Toast.makeText(mContext, "Provider Enabled! "+Double.toString(mLatitude)+" "+Double.toString(mLongitude), Toast.LENGTH_LONG).show();

        }

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2)
        {
            //Do something here if you would like to know when the provider status changes
            Toast.makeText(mContext, "Provider Status Changed! "+Double.toString(mLatitude)+" "+Double.toString(mLongitude), Toast.LENGTH_LONG).show();

        }
    }

【问题讨论】:

    标签: android gps locationmanager


    【解决方案1】:

    只要有 1 个或多个应用为 GPS 提供程序调用 requestLocationUpdates,GPS 就会保持开启状态。它不会在请求之间关闭。它不能这样做会导致它失去卫星锁定,这将导致它不得不重新建立。有时这需要超过 30 秒。所以 GPS 将一直保持,直到您取消注册 GPS 事件。

    【讨论】:

    • 如果我将间隔更改为 10 分钟会怎样?在这种情况下 GPS 图标会消失并在 10 分钟后重新出现吗?如果没有,那么也许我应该启动一个可运行的,每 10 分钟请求一次 requestSingleUpdate ?
    • 没有。因为您仍在请求更新。如果您真的希望它消失得那么严重,您需要停止请求更新并稍后重新请求它们。但预计在您请求后需要一两分钟才能获得信号,然后再过一分钟左右才能使信号变得准确。在此期间将显示符号。你为什么这么关心它?除非您试图隐瞒您要求位置的事实,否则这应该没什么大不了的。
    • 我不想浪费用户的电池。我想要他的“准确”位置,但频率并不重要。 5-10分钟的频率对我来说是可以的。最好的策略是什么?
    • 那么最好的办法是请求一次更新,然后在通过警报管理器获得它时设置一个计时器。当警报响起时,请求另一个。重复。
    • 谢谢。这几乎回答了我的问题。现在只是最后一个问题。这里的Handler不是比AlarmManager好吗?因为我只有在用户实际使用应用程序时才需要用户的位置。
    【解决方案2】:

    这个问题很老了,但如果能给出更好的答案,那就太好了。

    您需要使用Handler,它会以 5 分钟的间隔连续运行,因此您只需获取一次位置更新并释放 GPS 设备,这样您的应用将不会监听 GPS 更新,但您的处理程序知道什么时候应该再次调用它来监听更新。

    public static void getLocation(Context context) {
    
        Handler locationHandler = new Handler();
    
        locationHandler.post(new Runnable() {
            @Override
            public void run() {
                LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        // Handle the location update
                    }
    
                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
    
                    }
    
                    @Override
                    public void onProviderEnabled(String provider) {
    
                    }
    
                    @Override
                    public void onProviderDisabled(String provider) {
    
                    }
                }, null);
    
                locationHandler.postDelayed(this, 1000 * 60 * 5);
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多