我有一个Android应用程序,基本上想要跟踪用户一整天的动作,并每周向他们报告某些趋势。我最初认为只要用户启用了位置服务和/或GPS,系统就会一直试图让用户的位置保持最新状态。但是,在阅读Location Strategies上的文章后,我意识到情况并非如此。
看起来,即使用户已经选中了位置服务或GPS的盒子,接收器也只是在应用程序调用requestLocationUpdates之后才真正尝试确定设备的位置,并且将继续这样做,直到调用removeUpdates。 (如果这不正确,请告诉我。)
由于我的应用程序实际上只需要对设备的运动有一个“粗略”的想法,我只考虑每五分钟左右记录一次设备的位置。但是,该文章中的两个例子都没有描述这种应用。这两个示例都更多地是关于确定设备在特定时间点的位置,而不是试图“跟随”设备:用户创建的内容标记它的创建位置和定位附近的兴趣点。
我的问题是,让我的应用每隔五分钟“唤醒”,然后使用文章中的一种技术来确定设备的当前位置(通过开始收听,采取多个样本,确定最好的样本,停止收听,然后回去睡觉),或者开始收听更新并在五分钟更新之间给出最短时间并且永远不会停止聆听会更好吗?
答案 0 :(得分:0)
使用BroastcastReceiver定期获取新位置,即使您的应用不可见。不要使用服务,它可能会被杀死。
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(MyLocationBroadcastReceiver.action), 0);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5 * 60 * 1000, 100, pendingIntent);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, pendingIntent);
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, pendingIntent);
不要忘记将操作字符串添加到manifest.xml,并在那里添加ACCESS_FINE_LOCATION权限(用于GPS)。如果您不想要GPS,请使用ACCESS_COARSE_LOCATION。
<receiver android:name="MyLocationBroadcastReceiver" android:process=":myLocationBroadcastReceiver" >
<intent-filter>
<action android:name="Hello.World.BroadcastReceiver.LOCATION_CHANGED" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
在BroastcastReceiver.onReceive()中,你必须弄清楚你得到了什么。与新准确度相比,我丢弃距离之前位置较少的新位置。如果他们的精确度比前一个更差,我也会扔掉“最近”的位置。准确度高于100米的GPS修复通常毫无价值。您必须将位置存储在文件或首选项中,因为在onReceive()调用之间不存在BroastcastReceiver对象。
public class MyLocationBroadcastReceiver extends BroadcastReceiver
{
static public final String action = "Hello.World.BroadcastReceiver.LOCATION_CHANGED";
public void onReceive(Context context, Intent intent)
{
Location location = (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
if (location == null)
{
return;
}
// your strategies here
}
}