安卓地理围栏

Posted

技术标签:

【中文标题】安卓地理围栏【英文标题】:Android Geofencing 【发布时间】:2014-02-13 22:13:23 【问题描述】:

我已经查看了tutorial for Geofencing 并有疑问。

地理围栏是否需要您持续监控用户的位置?

或者当转换发生时,您添加地理围栏的 LocationClient 会自动触发吗?

这似乎是一个显而易见的问题,但本教程从未提及任何有关从位置管理器请求位置更新的内容。

【问题讨论】:

【参考方案1】:

您好,这取决于要求。应用程序中的位置跟踪可以根据特定要求通过以下方式实现。 1。在需要时请求设备的一个拍摄位置 如果应用需要请求设备在屏幕上的当前位置,比如某些 API 需要 lat-long 作为输入或需要原生使用 lat-long 来显示有关屏幕当前位置、地图屏幕等的一些信息,应用可以请求位置管理器获取当前位置同一活动类中的设备。这种方法不使用连续跟踪可以节省应用程序使用的电池。 最适合在特定或少数屏幕上需要定位时,但可能给出不太准确的位置

2。基于定时器/服务的连续位置跟踪方法 如果应用程序需要在前台和后台进行连续的位置跟踪,您可以编写自己的服务来及时跟踪位置。在这样的实现中,服务开始在某个时间间隔内侦听位置更新,并在某个时间关闭所有更新。

使用自己的位置跟踪服务也可以在后台跟踪位置。如果相应地确定计时器间隔,则可以满足所需的精度。基于地理围栏的连续位置跟踪方法

3.基于地理围栏的连续位置跟踪方法 Google Play 服务可以轻松监控特定半径的地理位置区域,即地理围栏。 无需为连续位置跟踪编写自己的服务。 与基于计时器/服务的方法相比,更好的电池优化。 当应用需要位置跟踪以进行分钟位置更新时,此方法不适合

更多信息请访问http://mobisoftinfotech.com/3-ways-to-implement-efficient-location-tracking-in-android-applications/

【讨论】:

嘿,根据那篇文章“当用户第一次获取设备的位置(此位置可能具有所需的精度)时,它将在该点创建具有预定半径的地理围栏并关闭位置更新. 此类地理围栏的退出事件被破坏,这意味着如果用户退出地理围栏,应用程序将破坏相同的地理围栏并开始位置更新”。我的问题是,您是否不需要知道用户每时每刻的确切位置才能知道用户何时退出该地理围栏?【参考方案2】:

地理围栏是否需要您持续监控用户的位置? - NO,它不需要您监控位置。

只有要求是

    注册您的地理围栏(一次性操作) 定位适配器应该打开(系统级设置,如果禁用,应用可以触发对话框打开定位适配器) Google Play 服务将自动触发操作,应用将收到回调

或者当转换发生时,您添加地理围栏的 LocationClient 会自动触发吗? - 是的 它将被自动触发。确保您设置了正确的过期时间戳并且位置适配器已开启。应用不需要知道当前位置

[可选]

另外,您可以抓住正确的地理围栏errors 来了解,为什么您的地理围栏没有被触发:

GEOFENCE_NOT_AVAILABLE 地理围栏服务现在不可用。通常这是因为用户在设置 > 位置访问中关闭了位置访问。

常数值:1000

GEOFENCE_TOO_MANY_GEOFENCES 您的应用已注册 100 多个地理围栏。在添加新地理围栏之前删除未使用的。

常数值:1001

GEOFENCE_TOO_MANY_PENDING_INTENTS 您已向 addGeofences(GoogleApiClient, GeofencingRequest, PendingIntent) 调用提供了超过 5 种不同的 PendingIntent。

常数值:1002

【讨论】:

【参考方案3】:
        public class MainActivity extends FragmentActivity implements
          OnMarkerDragListener 

         private GoogleMap googleMap;
         private int distance;
         private SupportMapFragment mapFragment;

         @Override
         public void onCreate(Bundle savedInstanceState) 
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          SupportMapFragment mapFragment = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map));
          googleMap = mapFragment.getMap();
          googleMap.setOnMarkerDragListener(this);
          distance = 100;
          googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(
            26.788707, 75.828108), 15));
          createGeofence(26.788707, 75.828108, distance, "CIRCLE", "GEOFENCE");
         
         private void createGeofence(double latitude, double longitude, int radius,
           String geofenceType, String title) 

          Marker stopMarker = googleMap.addMarker(new MarkerOptions()
            .draggable(true)
            .position(new LatLng(latitude, longitude))
            .title(title)
            .icon(BitmapDescriptorFactory
              .fromResource(R.drawable.stop_marker)));

          googleMap.addCircle(new CircleOptions()
            .center(new LatLng(latitude, longitude)).radius(radius)
            .fillColor(Color.parseColor("#B2A9F6"))); 
         
         @Override
         public void onMarkerDrag(Marker marker) 
         
         @Override
         public void onMarkerDragEnd(Marker marker) 
          LatLng dragPosition = marker.getPosition();
          double dragLat = dragPosition.latitude;
          double dragLong = dragPosition.longitude;
          googleMap.clear();
          createGeofence(dragLat, dragLong, distance, "CIRCLE", "GEOFENCE");
          Toast.makeText(
            MainActivity.this,
            "onMarkerDragEnd dragLat :" + dragLat + " dragLong :"
              + dragLong, Toast.LENGTH_SHORT).show();
          Log.i("info", "on drag end :" + dragLat + " dragLong :" + dragLong);

         
         @Override
         public void onMarkerDragStart(Marker marker) 
         



   main .xml 

    < ?xml version="1.0" encoding="utf-8"?>
     < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_ >

        < fragment
            android:id="@+id/map"
            android:layout_
            android:layout_
            class="com.google.android.gms.maps.SupportMapFragment" />
    < /RelativeLayout>

【讨论】:

以上是关于安卓地理围栏的主要内容,如果未能解决你的问题,请参考以下文章

地理围栏是不是可以包含许多其他地理围栏

在 Google 的地理围栏教程中没有看到地理围栏转换

实施地理围栏 - 在应用程序未运行时接收地理围栏转换事件

如何创建一个嵌入多边形以进行地理围栏的圆形地理围栏区域?

地理围栏:如何识别对象(特征),使用 Oracle Spatial 重叠地理围栏边界?

使用半径内的设备添加地理围栏时从未收到地理围栏停留事件