如何在 Google 基于地图的应用程序中延迟 onMapready 调用

How to delay onMapready call in Google map based app

在我的 android 应用程序中,我必须获取当前的 GPS/network 位置,然后在获取位置之前获取那个 position.But 的 google 地图,地图有已加载,每次它获得 (0,0) position.How 我可以延迟 On mapready 调用直到我获得位置。

代码

    package com.example.partha.map;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private  Position position;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);

        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        try {
            mMap = googleMap;

            // Add a marker in Sydney and move the camera

            position = new Position(this);
            position.getLocation(Position.NETWORK);
            LatLng sydney = new LatLng(position.getLatitude(),position.getLongitude());

            Log.d("position",position.getLatitude()+"   "+position.getLatitude());
            mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in your position"));
            Log.d("Added marker", " at position");
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
            Log.d("moved marker", " at position");
        }catch (Exception e)
        {
            Log.d("from on map",e.getMessage());
        }
    }
}

position.class

 public class Position {
        private boolean GPSPosition;
        private boolean networkPosition;
        private boolean SavedPosition;
        private Context context;
        private LatLng latLng;
        private double latitude;
        private double longitude;
        private LocationManager locationManager;
        private LocationListener listener;
        static public final int GPS = 2;
        static public final int NETWORK = 1;
        private float minDistance=5000;
        private long updateTime=0;


        public Position(Context context) {
            this.context = context;
            locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            setListener();

        }

        public Position(Context context, float minDistance, long updateTime) {
            this.context = context;
            this.minDistance = minDistance;
            this.updateTime = updateTime;
        }

        public void setUpdateTime(long updateTime) {
            this.updateTime = updateTime;
        }

        public void setMinDistance(float minDistance) {
            this.minDistance = minDistance;
        }

        @TargetApi(Build.VERSION_CODES.M)
        public void getLocation(int source) {
            if (source == GPS) {
                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

                    return;
                }
                else
                {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, updateTime, minDistance, listener);
                }
            }
            else if(source==NETWORK)
            {

                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,updateTime,minDistance,listener);
            }
        }

        public double getLongitude() {
            return longitude;
        }

        public double getLatitude() {
            return latitude;
        }

        public LatLng getLatLng() {
            return latLng;
        }

        private void setListener()
        {
            listener=new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {

                    latitude=location.getLatitude();
                    longitude=location.getLongitude();
                    latLng=new LatLng(latitude,longitude);
                    Log.d("Your position",latitude+"    "+longitude);

                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {
                    Intent settingsActivity = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(settingsActivity);

                }
            };
        }
    }

试试这个:在调用 getMapAsync 之前获取 latlng。删除在 onMapReady 方法中获取 latlng。

 LatLng sydney;
protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);


  position = new Position(this);
            position.setListener();
            position.getLocation(Position.NETWORK);
             sydney = new LatLng(position.getLatitude(),position.getLongitude());

        mapFragment.getMapAsync(this);
    }

另一种方式,在位置class创建一个界面,如

public interface LocationListener{
void onSuccessLocation(Position position);
void onFailLocation();
}

并在您的 activity 中实施它。在获取位置成功或失败时调用这些方法。然后 onSuccessLocation() 调用 getMapAsync.

在位置classonLocationChanged方法调用onSuccessLocation

public void onLocationChanged(Location location) {

                    latitude=location.getLatitude();
                    longitude=location.getLongitude();
                    latLng=new LatLng(latitude,longitude);
                    Log.d("Your position",latitude+"    "+longitude);
                    if(context != null){
                     ((LocationListener)context).onSuccessLocation(Position.this);
}
                }