0

Problems in this code:

  1. Latitude & Longitude Values always 0.0
  2. City Name is also empty in second activity (MenuActivity).
  3. 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);     
    }   
}
techraf
  • 64,883
  • 27
  • 193
  • 198
Safiullah
  • 39
  • 6

1 Answers1

0

Why dont you maintain a db for this, or you could save these values in shared preferences and then access it. If its a one time lat long thing, you could just pass those values as an intent parameters?

Ashish Kumar
  • 374
  • 4
  • 11
  • I am developing location based android application. and i want to access these values in multiple activities. So , i want to store these values in a method and then use that method name in other activities. – Safiullah Aug 31 '16 at 18:47
  • Save these values in shared preferences and make a utils class with a static function which would just take a context, read the values from shared preferences and return to the caller. This would let you access these values from any class which has a context – Ashish Kumar Aug 31 '16 at 18:49
  • No, i want to add save these values in splash activity and then access from other activities without creating utils class – Safiullah Aug 31 '16 at 18:55
  • If you just want to use it in one activity, you could have passed them in intent, but as you say, you want to use them in multiple activities, the correct way is to store them somewhere and then make a public getter function to access them – Ashish Kumar Aug 31 '16 at 18:58
  • get and set functions for lat, lon, currentCity values are also used in WelcomeActivity. but doesn't show any value in MenuActivity. Check My Code – Safiullah Aug 31 '16 at 19:05
  • 1
    Bro those values are not retained after the activity is destoryed, stopped, you have to use some persistent storage – Ashish Kumar Aug 31 '16 at 19:07
  • share any alternative code for this problem solution – Safiullah Aug 31 '16 at 19:46
  • Acitivty is a part of the UI, and not backend. So do not try to access values this way. While starting another activity you have to add the data in the intent. http://stackoverflow.com/questions/2091465/how-do-i-pass-data-between-activities-on-android – Harshul Pandav Sep 01 '16 at 05:40
  • Read the 4th comment properly dear – Ashish Kumar Sep 01 '16 at 05:49
  • @AshishSinha I was chiming in to agree with your approach. – Harshul Pandav Sep 01 '16 at 14:48