无法更新onLocationChanged()上的地图标记位置

时间:2019-07-02 10:16:13

标签: android google-maps google-maps-markers

我正在使用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;
    }
}

2 个答案:

答案 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()