Hello stackoferflow用户。
我正在开发Android应用程序和此应用程序实现Google Play Service
我已经获得了我的位置,并在我的地图上设置了一个别针和一个圆圈。
我想要实现的是每当我移动到某个地方时,圆圈也会移动并将我的位置设置为中心位置。
我的问题是:
如何每2-5秒更新一次当前位置,该圈子也将移至我当前的新位置
如何将我的圆圈区域设置为标记所在的区域,因此如果标记不在我的圆圈区域内,则不会显示在地图上。
谢谢
这是我用于地图的代码:
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setCompassEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
mMap.getUiSettings().setRotateGesturesEnabled(true);
locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
View v = getLayoutInflater().inflate(R.layout.marker, null);
TextView title= (TextView) v.findViewById(R.id.title);
TextView info= (TextView) v.findViewById(R.id.info);
title.setText(marker.getTitle().toString());
info.setText(marker.getSnippet().toString());
return v;
}
});
if(location != null){
double latitude = location.getLatitude();
double longitude = location.getLongitude();
myPosition = new LatLng(latitude, longitude);
CameraUpdate center = CameraUpdateFactory.newLatLngZoom(myPosition, 15);
mMap.moveCamera(center);
mMap.addMarker(new MarkerOptions()
.position(myPosition)
.alpha(0.8f)
.anchor(0.0f, 1.0f)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.blue_pin))
.title("Your position :\n ")
.snippet(latitude + " and " + longitude));
CircleOptions circleOptions = new CircleOptions()
.center(myPosition) //set center
.radius(rad) //set radius in meters
.fillColor(0x402092fd) //default
.strokeColor(Color.LTGRAY)
.strokeWidth(5);
circle = mMap.addCircle(circleOptions);
CameraPosition cameraPosition = CameraPosition.builder()
.target(myPosition)
.zoom(15)
.bearing(90)
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),2000, null);
}
谢谢=)
答案 0 :(得分:3)
您好每次更新您的位置必须使用broadcast.using这个您的服务开始,所以可以把您的地图代码放在线程中,你把延迟1秒,所以你得到位置每秒。你也把这个方法放在广播接收器类。
public void onReceive(final Context context, Intent intent) {
this.context = context;
Log.i(TAG, "onReceive");
locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// double valueLatitude = location.getLatitude();
// double valueLongitude= location.getLongitude();
double precision = Math.pow(10, 6);
double valueLatitude = ((int) (precision * location
.getLatitude())) / precision;
double valueLongitude = ((int) (precision * location
.getLongitude())) / precision;
Log.i(TAG, "onLocationChanged");
Log.v(TAG, "LAT: " + valueLatitude + " & LONG: "
+ valueLongitude);
String lat = String.valueOf(valueLatitude);
String lng = String.valueOf(valueLongitude);
SessionManager.saveLocation(valueLatitude, valueLongitude, context);
Log.v(TAG, "LAT: SESSION" + SessionManager.getlattitude(context));
try {
if (!SessionManager.getlattitude(context).equals(
valueLatitude)
|| !SessionManager.getlongitude(context)
.equals(valueLongitude)) {
SessionManager.saveLocation(valueLatitude,
valueLongitude, context);
// if (Utils.progrsDia.isShowing()) {
// Utils.progrsDia.dismiss();
// }
// CategoryNearbyFragment.callGetNearByFlyerListListner
// .callGetNearByFlyer(lat, lng);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onProviderDisabled(String arg0) {
}
@Override
public void onProviderEnabled(String arg0) {
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
}
};
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.requestSingleUpdate(
LocationManager.NETWORK_PROVIDER, listener, null);
} else {
// GlobalData.showSettingsAlert(context);
}
}
答案 1 :(得分:0)
第一个问题How to update my current location every 2-5 second and the circle will also move to my new current location
我建议您在Googles Receiving Location Updates指南中查看优秀且完整的示例。
它包含示例代码和您可以立即在ADT中导入的Android项目。
位置服务调用以向您的应用发送位置更新的回调方法在LocationListener接口的onLocationChanged()方法中指定。
您可以更新相机。
对于您的查询How to set my circle area as an area where the marker will place
,请按this链接
答案 2 :(得分:0)
我建议使用onLocationChange()方法将刷新的coords加载到lat long变量中,然后使用处理器定时5秒或10秒来使用moveCamera()函数更新map对象,这样你就会获得不太经常烦人的稳定更新!