Problems in this code:
- Latitude & Longitude Values always 0.0
- City Name is also empty in second activity (MenuActivity).
- Work correctly only when i access these values in MainActivity (WelcomeActivity) & don't use the 2nd MenuActivity.
WelcomeActivity.class
package com.example.safi.locations;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class WelcomeActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private Button buttons;
private static final String TAG = "WelcomeActivity";
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
public double latitudePosition;
public double longitudePosition;
public String currentCity;
private final int REQUEST_LOCATION = 200;
private final int REQUEST_CHECK_SETTINGS = 300;
private LocationRequest mLocationRequest;
private PendingResult<LocationSettingsResult> result;
private LocationSettingsRequest.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
buttons = (Button) findViewById(R.id.button);
buttons.setOnClickListener(this);
}
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = createLocationRequest();
builder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
final LocationSettingsStates mState = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
if (ActivityCompat.checkSelfPermission(WelcomeActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(WelcomeActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(WelcomeActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
} else {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
latitudePosition = mLastLocation.getLatitude();
setLatitudePosition(latitudePosition);
longitudePosition = mLastLocation.getLongitude();
setLongitudePosition(longitudePosition);
getAddressFromLocation(mLastLocation, getApplicationContext(), new GeoCoderHandler());
}
}
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(WelcomeActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
break;
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
if(mLastLocation != null) {
latitudePosition = mLastLocation.getLatitude();
setLatitudePosition(latitudePosition);
longitudePosition = mLastLocation.getLongitude();
setLongitudePosition(longitudePosition);
getAddressFromLocation(mLastLocation, getApplicationContext(), new GeoCoderHandler());
}
}
public static void getAddressFromLocation(final Location location, final Context context, final Handler handler) {
Thread thread = new Thread() {
@Override
public void run() {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
String result = null;
try {
List<Address> list = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
if (list != null && list.size() > 0) {
Address address = list.get(0);
result = address.getLocality();
}
} catch (IOException e) {
Log.e(TAG, "Impossible to connect to Geocoder", e);
}
finally {
Message msg = Message.obtain();
msg.setTarget(handler);
if (result != null) {
msg.what = 1;
Bundle bundle = new Bundle();
bundle.putString("address", result);
msg.setData(bundle);
} else
msg.what = 0;
msg.sendToTarget();
}
}
};
thread.start();
}
private class GeoCoderHandler extends Handler {
@Override
public void handleMessage(Message message) {
String result;
switch (message.what) {
case 1:
Bundle bundle = message.getData();
result = bundle.getString("address");
break;
default:
result = null;
}
currentCity = result;
setCurrentCity(currentCity);
}
}
public double getLatitudePosition(){
return latitudePosition;
}
public double getLongitudePosition(){
return longitudePosition;
}
final public String getCurrentCity(){
return currentCity;
}
public void setLatitudePosition(double latitudePosition){
this.latitudePosition = latitudePosition;
}
public void setLongitudePosition(double longitudePosition){
this.longitudePosition = longitudePosition;
}
public void setCurrentCity(String currentCity){
this.currentCity = currentCity;
}
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
return mLocationRequest;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivity(intent);
setContentView(R.layout.activity_menu);
}
}
}
MenuActivity.class
package com.example.safi.locations;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MenuActivity extends AppCompatActivity {
private TextView longi;
private TextView lati;
private TextView citi;
public String latiudeString;
public String longitudeString;
public String cityString;
WelcomeActivity ob = new WelcomeActivity();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
longitudeString = Double.toString(ob.getLongitudePosition());
latiudeString = Double.toString(ob.getLatitudePosition());
cityString = ob.getCurrentCity();
longi = (TextView) findViewById(R.id.lon);
longi.setText(longitudeString);
lati = (TextView) findViewById(R.id.lat);
lati.setText(latiudeString);
citi = (TextView) findViewById(R.id.city1);
citi.setText(cityString);
}
}