我正在使用Google地图,并且我想在onLocationChanged()
方法中更改用户位置时更改地图标记的位置。我尝试了许多关于堆栈溢出的解决方案,但都不适合我。
我已经尝试过Update marker position on google map smoothly和许多其他尝试,但都失败了。
我没有找到更新标记的正确方法。
非常感谢!
这是我的MapsActivity
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, TaskLoadedCallback {
static Marker now;
public static GoogleMap mMap;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_track_order);
Log.i("map", "create");
SupportMapFragment mapFragment1 = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
if (mapFragment1 != null) {
mapFragment1.getMapAsync(this);
}
initViews();
setToolbar()
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (!runtime_permissions()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
ContextCompat.startForegroundService(getApplicationContext(), serviceIntent);
} else {
startService(new Intent(getApplicationContext(), MyService.class));
}
}
mMap.addMarker(place1);
mMap.addMarker(place2);
CameraPosition googlePlex = CameraPosition.builder()
.target(new LatLng(31.527653,74.455632))
.zoom(7)
.bearing(0)
.tilt(45)
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(googlePlex), 5000, null);
}
这是我的服务班
public class MyService extends Service {
public static LocationListener listener;
public static LocationManager locationManager;
private String locationAddress;
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
String userAddress = address(latitude, longitude);
/*not working*/
Marker myMarker = null;
if(myMarker == null){
// marker = mMap.addMarker(options);
}
else {
marker.setPosition(new LatLng(location.getLatitude(),location.getLongitude()));
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
};
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
//noinspection MissingPermission
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, CommonObjects.DELAY_LOCATION_UPDATE, 0, listener);
return START_STICKY;
}
}
答案 0 :(得分:0)
请添加locationChangedMethod
MarkerOptions pin_01_markerOptions = new MarkerOptions();
pin_01_markerOptions.position(currentLatLng);
pin_01_markerOptions.icon(BitmapDescriptorFactory.fromBitmap(pin_01_marker));
mMap.addMarker(pin_01_markerOptions);
LatLng currentLatLng = new LatLng(location.getLatitude(),location.getLongitude());
CameraUpdate update = CameraUpdateFactory.newLatLngZoom(currentLatLng,
15);
mMap.moveCamera(update);
答案 1 :(得分:0)
经过大量思考,我知道我无法更新onLocationChanged()
中的地图标记。相反,我必须更新标记onMapReady()
方法。
通过将我的Service
类的广播发送到onMapReady()
方法,我得到了问题的解决方法在LocationChanged()上更新地图标记位置
更新的代码:
MyService.java
public class MyService extends Service {
...
@Override
public void onCreate() {
super.onCreate();
...
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
String userAddress = address(latitude, longitude);
/*sending broadcast*/
Intent i = new Intent("location_update");
i.putExtra("latitude", latitude);
i.putExtra("longitude", longitude);
i.putExtra("address", userAddress);
sendBroadcast(i);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
...
}
};
...
return START_STICKY;
}
}
MapsActivity.java
此外,这里我是从Service
开始,而不是onCreate()
的{{1}}。
onMapReady()