0

The default behavior of the new MapView / GoogleMap (Google Maps Android API V2) is to use only GPS locations. Indoors usually it means no location at all. I need when my app shows a MapView, the current (last known, best guess etc.) location to be centered/zoomed immediately, and the map's MyLocationButton to be functional all time. I do not need to track location changes for any other purpose.

Is it here a simpler way to grant all location providers for GoogleMap than using GoogleMap.setLocationSource() with my custom LocationSource class? I see LocationSource example here https://stackoverflow.com/a/14389975/935242 and other similar examples, they use old APIs which Google do not recommend anymore. Using Google Play Services is recommended, but for ensuring Network provided locations we should use the old tools, really?

Community
  • 1
  • 1
ggurov
  • 1,496
  • 2
  • 15
  • 21

1 Answers1

0

Here is your complete solution.add below code where you want to get location

LocationResult locationResult = new LocationResult(){
                @Override
                public void gotLocation(Location location) {
                    // TODO Auto-generated method stub
                    Latitude=location.getLatitude();
                    longitude=location.getLongitude();
                    Log.d("latitude",""+Latitude);
                    Log.d("latitude",""+longitude);
                }
            };
            MyLocation myLocation = new MyLocation();
            myLocation.getLocation(this, locationResult);

and create a class MyLocation to find location lat long

package com.example.util;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

import com.example.pgapplication.SearchResultActivity;

public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled=false;
    boolean network_enabled=false;

    public boolean getLocation(SearchResultActivity searchResultActivity, LocationResult result)
    {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        locationResult=result;
        if(lm==null)
            lm = (LocationManager) searchResultActivity.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
        try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

        //don't start listeners if no provider is enabled
        if(!gps_enabled && !network_enabled)
            return false;

        if(gps_enabled)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        if(network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
        timer1=new Timer();
        timer1.schedule(new GetLastLocation(),0);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
            lm.removeUpdates(locationListenerGps);
            lm.removeUpdates(locationListenerNetwork);

            Location net_loc=null, gps_loc=null;
            if(gps_enabled)
                gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if(network_enabled)
                net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            //if there are both values use the latest one
            if(gps_loc!=null && net_loc!=null){
                if(gps_loc.getTime()>net_loc.getTime())
                    locationResult.gotLocation(gps_loc);
                else
                    locationResult.gotLocation(net_loc);
                return;
            }

            if(gps_loc!=null){
                locationResult.gotLocation(gps_loc);
                return;
            }
            if(net_loc!=null){
                locationResult.gotLocation(net_loc);
                return;
            }
            locationResult.gotLocation(null);
        }
    }

    public static abstract class LocationResult{
        public abstract void gotLocation(Location location);
    }
}
  • My question is not about getting the location in any way, but about the behavior of the new MapView (com.google.android.gms.maps.MapView) or its wrapper MapFragment. See the picture: http://mobisys.in/blog/wp-content/uploads/2013/03/screen_MapsAPIv2_setMyLocationEnabled.png . The mentioned MyLocationButton is in the upper right corner. Even if I zoom to the some location in the beginning, this button will still not work. I want the behavior of the stock Android "Maps" application. – ggurov May 15 '14 at 15:20
  • Also, your code use the old API - android.location. Google suggests the usage of the new Location API - com.google.android.gms.location. – ggurov May 15 '14 at 15:26