尽快将用户的当前位置置于阈值内,同时节省电池电量.
首先,android有两个提供商; 网络和GPS.有时网络更好,有时GPS更好.
"更好"是指速度与准确度之比.
如果我几乎可以立即获得位置并且不打开GPS,我愿意牺牲几米精度.
其次,如果您要求更新位置更改,则在当前位置稳定时不会发送任何内容.
谷歌有一个确定"最佳"位置的例子:http://developer.android.com/guide/topics/location/obtaining-user-location.html#BestEstimate
但我认为它不是应该尽可能好的地方/可能.
我有点困惑为什么谷歌没有标准化的位置API,开发者不应该关心位置来自哪里,你应该只指定你想要的东西,手机应该为你选择.
我需要找到一个很好的方法来确定"最佳"位置,也许是一些启发式或者可能通过某些第三方库.
这并不意味着确定最好的提供商!
我可能会使用所有提供商并选择其中最好的.
该应用程序将以固定间隔收集用户的位置(假设每10分钟左右)并将其发送到服务器.
该应用程序应尽可能节省电池,并且位置应具有X(50-100?)米的精度.
目标是以后能够在地图上绘制白天用户的路径,因此我需要足够的准确性.
您认为对于期望和接受的准确度的合理价值是什么?
我一直在使用100米接受,并且根据需要使用30米,这要问多少?
我希望以后能够在地图上绘制用户的路径.
期望100米,接受500米更好吗?
此外,现在我每次更新GPS的时间最长为60秒,如果你在室内的准确度可能超过200米,这个位置太短了吗?
这是我目前的代码,感谢任何反馈(除了缺少错误检查,这是TODO):
protected void runTask() {
final LocationManager locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER));
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
if (getLocationQuality(bestLocation) != LocationQuality.GOOD) {
Looper.prepare();
setLooper(Looper.myLooper());
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateBestLocation(location);
if (getLocationQuality(bestLocation) != LocationQuality.GOOD)
return;
// We're done …Run Code Online (Sandbox Code Playgroud) 我正在考虑有两个单独的警报来每小时收集用户的位置数据,一个每隔59分钟关闭一次以"连接"客户端,第二个实际获取位置然后断开客户端.
就电池寿命而言,如果获取用户的位置将成为应用程序的主要消耗,我还应该考虑做些什么吗?或者,有两种警报有不同的方法吗?我最初只有一个警报,但执行(!mLocationClient.isConnected)然后连接检查不会给客户端足够的时间连接.
感谢您的见解.
这两个警报会像这样:
private int PERIODIC_UPDATE = 60000*60; //gets location and disconnects every hour
private int PERIODIC_RECONNECTION_UPDATE = 60000*59; //connects 1 minute before getLocation call
Timer toReconnect = new Timer();
toReconnect.schedule(new TimerTask() {
@Override
public void run() {
mLocationClient.connect();
}
}, 5000, PERIODIC_RECONNECTION_UPDATE);
Timer theTimer = new Timer();
theTimer.schedule(new TimerTask(){
@Override
public void run() {
try {
if(!mLocationClient.isConnected()) {
mLocationClient.connect();
//This will not have much affect because cannot so quickly, will remove.
}
Location theLocation = mLocationClient.getLastLocation();
if(theLocation!=null) { …Run Code Online (Sandbox Code Playgroud) 我必须在大约一天内使用GPS跟踪器构建应用程序.我在SO中也知道类似的问题,但我没有找到任何问题的答案.
- 我需要每10分钟进行一次GPS修复,所以我认为最好的方法是启动定位服务,获得修复(或超时)并停止服务(带removeUpdates()).如何让应用程序(或服务或其他)每10分钟运行一次这个循环,并确保只要剩余电量就会继续(即使设备进入睡眠状态,它应该每10分钟唤醒一次以获得修复)?使用AlarmManager是个好主意吗?
- 我希望这种方法能让电池持续一天吗?
我已经检查了mytracks,但gps监听器似乎总是打开,电池预计持续不超过5小时.
我还检查了CWAC位置轮询器,但它仅removeUpdates()在超时时执行并立即重新启动侦听器.它也使用唤醒锁,而在我的情况下,我认为AlarmManager可能是一个更好的主意.
任何帮助/建议欢迎
我正在开发一个有两个GPS服务的应用程序.其中一个是位置跟踪,它每2分钟向服务器发送一次位置更新,而另一个服务是cyberseatbelt,它在位置更新时检查设备的速度.
使用这两项服务,我的手机显示电池消耗量为77%.如果没有这两项服务,则不会显示电池消耗.
是否有任何解决方案可以在保持所需功能的同时节省设备电池电量?
我需要实现基于位置的服务.我不需要精确的位置,因此不需要GPS.
最简单的方法是在应用开始时开始侦听位置更新,并将其保持为ON:
mLocationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 100, mPendingIntent);
Run Code Online (Sandbox Code Playgroud)
由于我不需要太多精确度,我将更新的最大频率设置为10秒和100米而不是默认值0,0.
当我们考虑位置时,我们认为电池耗尽,但我想这是一个快捷方式,只有GPS真正耗尽电池.我认为这种网络提供商的使用不会耗尽电池.有什么想法吗?
我想知道是否有人创建了一个在后台启动的应用程序并利用GPS每分钟左右收集当前的Lat和Long?如果有,请你提供电池时间吗?就像在你的手机使用标准手机程序运行该背景应用程序所需的时间一样,你的手机可以使用多长时间.
我正在试图看看是否值得花时间为自己创建一个应用程序,但如果我工作了8个小时并且在那段时间没有办法给我的手机充电那么我不想回家而且它关闭了在我的应用程序上,我会在我家创建作品.我需要该应用程序才能工作,因为它会看到我在家中的范围(从GPS),然后从我的手机发送命令到我家的服务器.这就是为什么它需要能够每隔1分钟左右在后台进行检查.
或者只在每天下午5点之后开启GPS(这是否适用于iOS和Android?),以便最大限度地减少电池的负载?!?
任何帮助或建议都会很棒!谢谢!