我已经阅读了地理围栏的教程,但我心中有疑问。
地理围栏是否需要您持续监控用户的位置?
或者,当转换发生时,您添加地理围栏的LocationClient会自动触发吗?
这似乎是一个显而易见的问题,但本教程从未提及从位置管理器请求位置更新的任何内容。
我已经阅读了地理围栏的教程,但我心中有疑问。
地理围栏是否需要您持续监控用户的位置?
或者,当转换发生时,您添加地理围栏的LocationClient会自动触发吗?
这似乎是一个显而易见的问题,但本教程从未提及从位置管理器请求位置更新的任何内容。
嗨,这取决于要求。应用程序中的位置跟踪可以根据特定要求通过以下方式实现。 1. 在任何需要的地方请求设备的一次拍摄位置 如果应用程序需要请求设备在屏幕上的当前位置,说某些 API 需要 lat-long 作为输入,或者需要在本机使用 lat-long 来显示有关屏幕当前位置、地图屏幕等的一些信息。 ,应用程序可以请求位置管理器在同一活动类中获取设备的当前位置。这种方法不使用连续跟踪可以节省应用程序使用的电池。最适合在特定或少数屏幕上需要定位时,但可能给出不太准确的位置
2.基于定时器/服务的连续位置跟踪方法 如果应用程序需要在前台和后台进行连续的位置跟踪,您可以编写自己的服务来定时跟踪位置。在这样的实现中,服务开始在某个时间间隔内侦听位置更新,并在某个时间关闭所有更新。
使用自己的位置跟踪服务也可以在后台跟踪位置。如果相应地确定定时器间隔,则可以满足所需的精度。基于地理围栏的连续位置跟踪方法
3. 基于地理围栏的连续位置跟踪方法 Google Play 服务可以轻松监控一定半径的地理位置区域,称为地理围栏。无需为连续位置跟踪编写自己的服务。与基于计时器/服务的方法相比,更好的电池优化。当应用程序需要位置跟踪以进行分钟位置更新时,此方法不适用
欲了解更多信息,请访问http://mobisoftinfotech.com/3-ways-to-implement-efficient-location-tracking-in-android-applications/
地理围栏是否需要您持续监控用户的位置?-不,它不需要您监控位置。
只有要求是
或者,当转换发生时,您添加地理围栏的 LocationClient 会自动触发吗?- YES 会自动触发。确保您设置了正确的到期时间戳并且位置适配器已打开。应用不需要知道当前位置
[可选的]
此外,您可以捕获正确的地理围栏错误以了解为什么您的地理围栏没有被触发:
GEOFENCE_NOT_AVAILABLE 地理围栏服务现在不可用。通常这是因为用户在设置 > 位置访问中关闭了位置访问。
常数值:1000
GEOFENCE_TOO_MANY_GEOFENCES 您的应用已注册超过 100 个地理围栏。在添加新的地理围栏之前删除未使用的。
常数值:1001
GEOFENCE_TOO_MANY_PENDING_INTENTS 您已经为 addGeofences(GoogleApiClient, GeofencingRequest, PendingIntent) 调用提供了超过 5 个不同的 PendingIntent。
常数值:1002
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_width="match_parent"
android:layout_height="match_parent" >
< fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
< /RelativeLayout>