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

时间:2016-06-12 07:05:39

标签: android google-maps gps android-gps

在我的Android应用程序中,我必须获取当前的GPS /网络位置,然后获取该位置的谷歌地图。但在获取位置之前,地图已经加载并且每次获得(0,0)位置。如何延迟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);

                }
            };
        }
    }

1 个答案:

答案 0 :(得分:0)

试试这个:在调用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);
    }

另一种方法是在Position类中创建一个接口,如

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

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

在Position类中,onLocationChanged方法调用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);
}
                }