在 Android 上以对电池影响最小的方式获取用户位置
Getting user location with minimal impact for battery on Android
我开始开发一个应用程序,它将永远留在后台并检测用户何时在某个位置停留一段时间(然后显示通知邀请用户打开应用程序以获取有关该地点的信息)。
这与 Google 地图在您进入餐厅时所做的非常相似,它会向您显示一条通知以检查餐厅的评分。
我想要的是对设备的影响最小,所以位置更新应该非常"passive",只有在用户不移动时才获取位置,如果可能的话,回收已经获取的位置数据通过其他活动 - 可能通过 Google 地图本身或设备上 运行 的其他位置应用程序。
这不是导航应用程序,所以我不需要实时准确位置,而只需要最准确和最省力的大概位置,而且前提是用户没有移动。
LocationListener
和 onLocationChanged
似乎是我的人,但我可以指定我不想触发设备的传感器并且只在其他范围可用时重新使用位置数据吗?我的应用程序应该检查这些信息,然后在它们足够准确时决定进行反向地理编码。
是的,LocationListener
和 onLocationChanged
是你的人,但对于被动实施,你可以通过几个选项。
首先你可以检查最后一个已知位置,也许可以比较它的时间;即 getTime() 并验证它是否对您有用。
就代码而言,字面上...
Google samples, android location 具有与最后位置部分相关的内容:
/**
* Runs when a GoogleApiClient object successfully connects.
*/
@Override
public void onConnected(Bundle connectionHint) {
// Provides a simple way of getting a device's location and is well suited for
// applications that do not require a fine-grained location and that do not need location
// updates. Gets the best and most recent location currently available, which may be null
// in rare cases when a location is not available.
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
此外,您可以将它与 LocationRequest 对象结合起来,这有助于您的实现,因为您可以在尝试后立即调用它 getLastLocation()
并且基本上有更可靠的获取位置的安排。
// Create the location request
mLocationRequest = LocationRequest.create()
//priority object needs to be set, the following will definitely get results for you
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
//interval updates can be on the lines of 15mins or 30... acc to your requirement
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL);
// Request location updates
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
mLocationRequest, this);
我建议尝试 PRIORITY_NO_POWER,可以与 getLastLocation()
结合使用。添加这些电源模式专门用于优化 battery/power 消耗和检索位置的效率。
我开始开发一个应用程序,它将永远留在后台并检测用户何时在某个位置停留一段时间(然后显示通知邀请用户打开应用程序以获取有关该地点的信息)。
这与 Google 地图在您进入餐厅时所做的非常相似,它会向您显示一条通知以检查餐厅的评分。
我想要的是对设备的影响最小,所以位置更新应该非常"passive",只有在用户不移动时才获取位置,如果可能的话,回收已经获取的位置数据通过其他活动 - 可能通过 Google 地图本身或设备上 运行 的其他位置应用程序。 这不是导航应用程序,所以我不需要实时准确位置,而只需要最准确和最省力的大概位置,而且前提是用户没有移动。
LocationListener
和 onLocationChanged
似乎是我的人,但我可以指定我不想触发设备的传感器并且只在其他范围可用时重新使用位置数据吗?我的应用程序应该检查这些信息,然后在它们足够准确时决定进行反向地理编码。
是的,LocationListener
和 onLocationChanged
是你的人,但对于被动实施,你可以通过几个选项。
首先你可以检查最后一个已知位置,也许可以比较它的时间;即 getTime() 并验证它是否对您有用。
就代码而言,字面上...
Google samples, android location 具有与最后位置部分相关的内容:
/**
* Runs when a GoogleApiClient object successfully connects.
*/
@Override
public void onConnected(Bundle connectionHint) {
// Provides a simple way of getting a device's location and is well suited for
// applications that do not require a fine-grained location and that do not need location
// updates. Gets the best and most recent location currently available, which may be null
// in rare cases when a location is not available.
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
此外,您可以将它与 LocationRequest 对象结合起来,这有助于您的实现,因为您可以在尝试后立即调用它 getLastLocation()
并且基本上有更可靠的获取位置的安排。
// Create the location request
mLocationRequest = LocationRequest.create()
//priority object needs to be set, the following will definitely get results for you
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
//interval updates can be on the lines of 15mins or 30... acc to your requirement
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL);
// Request location updates
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
mLocationRequest, this);
我建议尝试 PRIORITY_NO_POWER,可以与 getLastLocation()
结合使用。添加这些电源模式专门用于优化 battery/power 消耗和检索位置的效率。