0

I am trying to access my Current Location in onLocationChanged method, in onMapReady method, but currentlatlng is returning null. Any guidance will be helpful.

Here is the code:

public class MapActivity extends FragmentActivity implements OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener,GoogleMap.OnInfoWindowClickListener {

JSONArray jsonArray;
String json_string;
int _id;
String _doctorname;
String _doclat;
String _doclong;
public static LatLng currentlatLng = null;
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
private GoogleMap mMap;

Location mLastLocation;
Marker mCurrLocationMarker;

Location _location;
MarkerOptions _markeroption;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
   // int x =_st.jsonArray.length();
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkLocationPermission();
    }

    // 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);

}

@Override
public void onMapReady(GoogleMap googleMap) {
//Get Last Known Location and convert into Current Longitute and Latitude
//        final LocationManager mlocManager = (LocationManager)    this.getSystemService(Context.LOCATION_SERVICE);
//        final Location currentGeoLocation = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//
//        double currentLat = currentGeoLocation.getLatitude();
//        double currentLon = currentGeoLocation.getLongitude();
//
//        LatLng currentLatLng = new LatLng(currentLat,currentLon);
//Toast.makeText(this,"Cur Lat" +currentLat+"Lon"+currentLon,Toast.LENGTH_LONG).show();

    // Get JSON String and Break it down into individual nodes
    //double x=_location.getLatitude();
    //double y=_location.getLongitude();
    json_string = getIntent().getExtras().getString("JSON_DTA");
    LatLng latLng = null;
    try {
        int count = 0;
        //jsonObject = new JSONObject(json_string);
        jsonArray = new JSONArray(json_string);

        while (count < jsonArray.length()) {
            JSONObject JO = jsonArray.getJSONObject(count);
            _id = JO.getInt("id");
            _doctorname = JO.getString("doctorname");
            _doclat = JO.getString("latitude");
            _doclong = JO.getString("longitude");

            count++;

            Double d = Double.parseDouble(_doclat);
            Double e = Double.parseDouble(_doclong);
            latLng = new LatLng(d, e);

            DecimalFormat df = new DecimalFormat("####0.0");

            DistanceBetweenPoints distanceBetweenPoints = new DistanceBetweenPoints();
           // double  distance = distanceBetweenPoints.CalculationByDistance(currentLatLng,latLng);

            int distanceThreshHold = 7;
            //if(distance < distanceThreshHold  )
            {
                mMap = googleMap;
                MarkerOptions _markeroptions = new MarkerOptions()
                        .position(latLng)
                        .title(_doctorname +  " KM" )
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.gps));

              //  mMap = googleMap;
                mMap.addMarker(_markeroptions);
                mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                mMap.setOnInfoWindowClickListener(this);
            }

     }


    } catch (JSONException e) {
        e.printStackTrace();
    }

    //Initialize Google Play Services
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            buildGoogleApiClient();

            mMap.setMyLocationEnabled(true);

        }
    } else {
        buildGoogleApiClient();
        mMap.setMyLocationEnabled(true);
    }
}

protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect();
}
@Override
public void onConnected(@Nullable Bundle bundle) {

    mLocationRequest = new LocationRequest();

    mLocationRequest.setInterval(1000);
    mLocationRequest.setFastestInterval(1000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }

}

@Override
public void onConnectionSuspended(int i) {

}


@Override
public void onLocationChanged(Location location) {

        mLastLocation = location;
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }


        //Place current location marker
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(latLng);
        markerOptions.title("Current Position");

        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
        mCurrLocationMarker = mMap.addMarker(markerOptions);


      //  Toast.makeText(this, "Current" + latLng, Toast.LENGTH_LONG).show();
        String tag = null;
        Log.d(tag, "lon: " + location.getLongitude() + " ----- lat: " + location.getLatitude());


        //move map camera
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(11));


        //stop location updates
        if (mGoogleApiClient != null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        }


    }




@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

public boolean checkLocationPermission(){
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Asking user if explanation is needed
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

            //Prompt the user once explanation has been shown
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);


        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);
        }
        return false;
    } else {
        return true;
    }
}
@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // Permission was granted.
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {

                    if (mGoogleApiClient == null) {
                        buildGoogleApiClient();
                    }
                    mMap.setMyLocationEnabled(true);
                }

            } else {

                // Permission denied, Disable the functionality that depends on this permission.
                Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
            }
            return;
        }

        // other 'case' lines to check for other permissions this app might request.
        //You can add here other case statements according to your requirement.
    }
}

@Override
public void onInfoWindowClick(Marker marker) {
    Intent intent = new Intent(MapActivity.this,DoctorAppointment.class);

    startActivity(intent);
}

Maybe I am missing something really simple. Thank you in advance.

bluedroid
  • 305
  • 3
  • 15
AIS
  • 297
  • 1
  • 4
  • 16

1 Answers1

1

use like below in OnLocationChanged.

location.getLatitude()
location.getLongtitude()

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat_own, lng_own), 14));
AAA
  • 485
  • 6
  • 23
  • I have my current location, in OnLocationChanged (latlng variable). I need this value in method onMapReady where I am calling it 'DistanceBetweenPoints distanceBetweenPoints = new DistanceBetweenPoints(); double distance = distanceBetweenPoints.CalculationByDistance(currentlatLng,latLng);' – AIS Aug 07 '16 at 07:30
  • you can create a method with two parameter of lat long and send from OnLocationChanged, and get that values from onMapReady and calculate distance. another way declare location in field and do the the process of getting distance. – AAA Aug 07 '16 at 09:33
  • I created a method public String getCurrentLocation( LatLng latLng){ return String.valueOf(latLng); } and passed value of current location by calling getCurrentLocation(latLng); in OnLocationChanged method. In onMapReady I am trying to access this through LatLng abc = null; String a =getCurrentLocation(abc); but abc is still null – AIS Aug 07 '16 at 09:44
  • I have updated the code in the question. While debugging, i do get my current Location in getCurrentLocation() but it is not accessible in onMapReady. Getting null/ – AIS Aug 07 '16 at 10:05
  • just do as like, declare location in field level and get lat long easily.and yeah sometimes it required times to get location . you can add condition (location!=null) before accessing location. and – AAA Aug 07 '16 at 10:40
  • I dont think that is the problem. Can you explain further? – AIS Aug 07 '16 at 12:18