在Android Studio上为增强GeofencingApi轮询GPS位置的正确程序
我不是程序员,但即便如此,我还是努力“混合”(来自其他人的样本和说明)一个小型安卓项目,用于艺术装置,将在当地大学校园的户外展示。该应用程序将显示弹出窗口,其中包含在穿越现场各自的径向围栏时发生在该地点的事件的轶事叙述,需要不依赖数据载体或wi-fi提供商的位置采集,因为该区域没有覆盖范围,而且即使在城市环境中测试,在网络和wi-fi信号可用的情况下,这些位置采集似乎也相当不稳定 我使用的是android开发者文档附带的官方示例,但是我已经读到,由于过于高效的实践,开发者倾向于API只使用手机数据和wi-fi,除非GPS_提供商通过locationManager轮询其输出,以便一旦应用程序请求,geofence实例可以主要从那里检索更精确的位置。但是我被困在代码的哪一部分来添加这些相关的行,无论它是java文件夹中的一个单独类还是Mainactivity本身,以及结构中的其他地方(除了以权限形式显示的清单),我必须引用它们的存在才能使其协调工作在Android Studio上为增强GeofencingApi轮询GPS位置的正确程序,android,location,Android,Location,我不是程序员,但即便如此,我还是努力“混合”(来自其他人的样本和说明)一个小型安卓项目,用于艺术装置,将在当地大学校园的户外展示。该应用程序将显示弹出窗口,其中包含在穿越现场各自的径向围栏时发生在该地点的事件的轶事叙述,需要不依赖数据载体或wi-fi提供商的位置采集,因为该区域没有覆盖范围,而且即使在城市环境中测试,在网络和wi-fi信号可用的情况下,这些位置采集似乎也相当不稳定 我使用的是android开发者文档附带的官方示例,但是我已经读到,由于过于高效的实践,开发者倾向于API只使用手机数
欢迎任何帮助。从您的描述中,我推断您有几个限制。让我解释一下我的理解:
- 您希望在多台设备上部署位置感知应用程序,用于展览/艺术安装
- 这些设备将没有连接(没有WiFi,没有蜂窝网络),因此只需要使用GPS
- 您希望检测每个设备何时进入预定义区域,即感兴趣点周围的固定半径
LocationManager vs.Google(Play Services)位置API 首先,重要的是要了解,在过去几年中,获得位置更新的普遍推荐方式已经发生了变化,从通过Android(+DIY fusion logic)手动但细粒度地设置位置更新转向了更强大和方便的方式 我认为您知道这两个(以及位置API的一部分)并且已经排除了后者,因为连接问题。让我们来看看如何用<强>位置管理器< /强> ./p>来完成它。
使用LocationManager获取更新 但是我被困在代码的哪一部分来添加这些相关的行,无论它是java文件夹中的一个单独类还是Mainactivity本身,以及结构中的其他地方(除了以权限形式显示的清单),我必须引用它们的存在才能使其协调工作 您是在活动中使用位置管理器,还是在其他地方使用位置管理器,主要取决于您是需要在一个活动中更新位置,还是需要在多个活动中更新位置 案例1:仅在一项活动中定位 您可以在该活动的生命周期内安全地实例化、启动和停止manager
public MyActivity extends Activity implements LocationListener {
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
...
// Request GPS updates every second (careful: high battery drain)
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, this);
}
@Override
protected void onPause() {
locationManager.removeUpdates(this);
super.onPause();
}
@Override
public void onLocationChanged(Location location) {
// Do something with the location
}
// Implement other LocationListener interface methods here, handle provider status changes
}
案例2:多个活动中的位置
详细的代码示例将超出此答案的范围,但让我提供一个草图:
- 创建一个保存LocationManager实例的自定义类,并在应用程序生命周期中启动/停止它。我已经写了一篇文章,你可以用它(你可以阅读更多)
- 应用程序类还可以实现LocationListener接口,尽管将该逻辑打包到您自己的类(例如LocationHelper类)中并从应用程序启动和停止该类可能更为简洁
- 最后,通过事件总线(例如或)分发位置更新,以便任何活动、片段或其他类都可以订阅这些更新,而无需知道这些位置来自何处李>
检查地理围栏 为了简单起见,让我们假设您只进行一个活动和一个地理围栏。然后,您可以按如下方式检查是否包含/排除该地理围栏中的当前位置:
public MyActivity extends Activity implements LocationListener {
// Define a hard-coded POI and geofence radius
private static final Location POI_A = new Location("dummy");
static {
POI_A.setLongitude(/* POI longitude */);
POI_A.setLatitude(/* POI latitude */);
}
private static final int GEOFENCE_RADIUS = 50; // meters
...
@Override
public void onLocationChanged(Location location) {
if (location.distanceTo(POI_A) <= GEOFENCE_RADIUS) {
// Location is within geofence of point of interest A
} else {
// Location is outside the geofence of point of interest A
}
}
公共MyActivity扩展活动实现LocationListener{
//定义硬编码POI和地理围栏半径
专用静态最终位置POI_A=新位置(“虚拟”);
静止的{
POI_A.设置经度(/*POI经度*/);
POI_A.设置纬度(/*POI纬度*/);
}
专用静态最终内部土工围栏_半径=50;//米
...
@凌驾
已更改位置上的公共无效(位置){
if(location.distanceTo(POI_A)谢谢你,它现在可以工作了!在我尝试将代码添加到我正在使用的示例中之后,出现了一些错误,但是在尝试了几次之后,所有的错误都消失了。我学到了更多关于语法的知识,当问题进一步深入时,让IDE解决某些问题可能是无用的(在这种情况下,我没有为LocationListener等选择正确的包)。地理定位现在可以独立于wifi或手机可用性工作。再次感谢您的参与和精心定制的响应。顺便说一句,我还偶然发现了您的博客,其中有许多有用的主题我可能很快就会需要。例如,我计划在我的应用程序中使用矢量图形作为插图,您激励我放弃kscape a go(无论如何,我无法访问任何其他付费矢量编辑器)此外,关于您建议在附近设置接入点的建议,我相信这可能不会有任何效果,因为他们拥有的网络基础设施要求校友特定的密码和用户名(访客不容易获得这些密码和用户名)