Hello there i am having a problem in my project.I am trying to get the users location and then get some data from the URL.But the problem is that the userLongitude and userLatitude are shown to be zero when I build my Url.There is no problem in the location methods as I am getting the users location in OnMapReady part but not in OnLoaderCreated part.I need them on both.
The result from test1 textView comes as 0.0 0.0 and from test2 textView gives my coordinates.
Could you suggest a workaround?
public class MapActivity extends AppCompatActivity implements
LoaderManager.LoaderCallbacks<List<Locations>>, OnMapReadyCallback {
public static final String LOG_TAG = MapActivity.class.getName();
private static final String URL="https://maps.googleapis.com/maps/api/place/nearbysearch/json";
private static final int LOCATION_LOADER_ID = 1;
private GoogleMap map;
private ProgressBar pb;
private TextView loadingTV;
private ArrayList<Locations> data;
private double userLongitude;
private double userLatitude;
private FrameLayout mapView;
FusedLocationProviderClient locationProviderClient;
int PERMISSION_ID = 44;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
permissionRequest();
locationProviderClient= LocationServices.getFusedLocationProviderClient(this);
getLastLocation();
pb = (ProgressBar) findViewById(R.id.progressBar);
loadingTV = (TextView) findViewById(R.id.loadingTV);
mapView=(FrameLayout) findViewById(R.id.map);
mapView.setVisibility(View.GONE);
ConnectivityManager cm =
(ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
TextView noNetTV = (TextView) findViewById(R.id.noNetTV);
if (!isConnected) {
pb.setVisibility(View.GONE);
loadingTV.setVisibility(View.GONE);
} else {
noNetTV.setVisibility(View.GONE);
LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(LOCATION_LOADER_ID, null, this);
}
}
private boolean checkPermissions() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
return true;
}
return false;
}
private void requestPermissions() {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_ID
);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_ID) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLastLocation();
}
}
}
private void getLastLocation(){
if (checkPermissions()) {
if (isLocationEnabled()) {
locationProviderClient.getLastLocation().addOnCompleteListener(
new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
Location location = task.getResult();
if (location == null) {
requestNewLocationData();
} else {
userLatitude= location.getLatitude();
userLongitude= location.getLongitude();
}
}
}
);
} else {
Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
} else {
requestPermissions();
}
}
private boolean isLocationEnabled() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
LocationManager.NETWORK_PROVIDER
);
}
@Override
public void onResume(){
super.onResume();
if (checkPermissions()) {
getLastLocation();
}
}
private void requestNewLocationData() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(0);
mLocationRequest.setFastestInterval(0);
mLocationRequest.setNumUpdates(1);
locationProviderClient = LocationServices.getFusedLocationProviderClient(this);
locationProviderClient.requestLocationUpdates(
mLocationRequest, mLocationCallback,
Looper.myLooper()
);
}
private LocationCallback mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
Location mLastLocation = locationResult.getLastLocation();
userLatitude= mLastLocation.getLatitude();
userLongitude= mLastLocation.getLongitude();
}
};
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.getUiSettings().setMyLocationButtonEnabled(false);
map.setMyLocationEnabled(true);
LatLng user = new LatLng(userLatitude,userLongitude);
**TextView test2=(TextView)findViewById(R.id.locations);
test2.setText(""+userLatitude+" "+userLongitude);**
Iterator<Locations> iterator=data.iterator();
while (iterator.hasNext()){
Locations loc=iterator.next();
LatLng marker=new LatLng(loc.getLatitude(),loc.getLongitude());
Toast.makeText(this,"Works",Toast.LENGTH_LONG).show();
map.addMarker(new MarkerOptions()
.position(marker)
.title(loc.getName()));
}
pb.setVisibility(View.GONE);
loadingTV.setVisibility(View.GONE);
// mapView.setVisibility(View.VISIBLE);
map.animateCamera(CameraUpdateFactory.newLatLngZoom(user, 13));
// map.moveCamera(CameraUpdateFactory.newLatLng(user));
}
@Override
public Loader<List<Locations>> onCreateLoader(int i, Bundle bundle) {
String finalUrl=URL+"?"+"type=hospital"+"&key="+getString(R.string.google_maps_key)+"&radius=1500"+"&location="+userLatitude+","+userLongitude;
**TextView test1=(TextView)findViewById(R.id.locations);
test1.setText(""+userLatitude+" "+userLongitude);**
return new LocationAsyncTaskLoader(MapActivity.this,finalUrl);
}
@Override
public void onLoadFinished(android.content.Loader<List<Locations>> loader, List<Locations> locat) {
data=new ArrayList<>(locat.size());
data.addAll(locat);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onLoaderReset(android.content.Loader<List<Locations>> loader) {
// data.clear();
}
private void permissionRequest() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
} else {
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION },
1);
}
}
}