3

Whenever I use LocationManager and LocationListener, while using the AndroidEmulator, I get the location, using the extra tools when I set the latitude and longitude

I checked out other question-answers but i am new to Android Development so i really could not understand the answer. so i raised a new question, i would appreciate the review of my code. Thanks.

but when I run on a physical device my code does not give me my current location on start. How do I get the current location? I also tried getLastKnownLocation but even that does not work.

package com.londonappbrewery.climapm;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import org.json.JSONObject;

import cz.msebera.android.httpclient.Header;


public class WeatherController extends AppCompatActivity {

    // Constants:
    final String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather";
    // App ID to use OpenWeather data
    final String APP_ID = "5563c6a4ddd7d7181b257988cc2b1ad1";
    // Time between location updates (5000 milliseconds or 5 seconds)
    final long MIN_TIME = 5000;
    // Distance between location updates (1000m or 1km)
    final float MIN_DISTANCE = 1000;
    //Request Code
    final int REQUEST_CODE = 123;

    // TODO: Set LOCATION_PROVIDER here:
    String LOCATION_PROVIDER = LocationManager.GPS_PROVIDER;


    // Member Variables:
    TextView mCityLabel;
    ImageView mWeatherImage;
    TextView mTemperatureLabel;

    // TODO: Declare a LocationManager and a LocationListener here:
    LocationManager mLocationManager;
    LocationListener mLocationListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.weather_controller_layout);

        // Linking the elements in the layout to Java code
        mCityLabel = (TextView) findViewById(R.id.locationTV);
        mWeatherImage = (ImageView) findViewById(R.id.weatherSymbolIV);
        mTemperatureLabel = (TextView) findViewById(R.id.tempTV);
        ImageButton changeCityButton = (ImageButton) findViewById(R.id.changeCityButton);


        // TODO: Add an OnClickListener to the changeCityButton here:
        changeCityButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(WeatherController.this, ChangeCityController.class);
                startActivity(intent);
            }
        });

    }


    // TODO: Add onResume() here:
    @Override
    protected void onResume() {
        super.onResume();

        Log.d("Clima", "onResume() called");

        Intent intent = getIntent();
        String cityName = intent.getStringExtra("cityName");

        if (cityName != null) {

            //Log.d("Clima", cityName);
            getWeatherForNewCity(cityName);

        } else {
            Log.d("Clima", "Getting weather for current location");
            getWeatherForCurrentLocation();
        }


    }


    // TODO: Add getWeatherForNewCity(String city) here:
    private void getWeatherForNewCity(String city) {

        RequestParams params = new RequestParams();
        params.put("q", city);
        params.put("appid", APP_ID);
        letsDoSomeNetworking(params);

    }

    // TODO: Add getWeatherForCurrentLocation() here:
    private void getWeatherForCurrentLocation() {

        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                //Log.d("Clima", "");

                String latitude = String.valueOf(location.getLatitude());
                String longitude = String.valueOf(location.getLongitude());

                Log.d("Clima", "onLocationChanged() callback received");
                Log.d("Clima", "Latitude is " + latitude);
                Log.d("Clima", "Longitude is " + longitude);

                RequestParams params = new RequestParams();
                params.put("lat", latitude);
                params.put("lon", longitude);
                params.put("appid", APP_ID);
                letsDoSomeNetworking(params);


            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

                Log.d("Clima", "onProviderDisabled() callback received");

            }
        };

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);

            return;
        }

        mLocationManager.requestLocationUpdates(LOCATION_PROVIDER, MIN_TIME, MIN_DISTANCE, mLocationListener);
        Location location = mLocationManager.getLastKnownLocation(LOCATION_PROVIDER);
        if(location != null) {
            RequestParams params = new RequestParams();
            params.put("lat", location.getLatitude());
            params.put("lon", location.getLongitude());
            params.put("appid", APP_ID);
            letsDoSomeNetworking(params);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQUEST_CODE) {

            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Log.d("Clima", "onRequestPermissionResult(): Permission Granted!");
                //mLocationManager.requestLocationUpdates(LOCATION_PROVIDER, MIN_TIME, MIN_DISTANCE, mLocationListener);
                getWeatherForCurrentLocation();


            }

        }

    }

    // TODO: Add letsDoSomeNetworking(RequestParams params) here:
    private void letsDoSomeNetworking(RequestParams params) {

        AsyncHttpClient client = new AsyncHttpClient();

        client.get(WEATHER_URL, params, new JsonHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] header, JSONObject response) {

                Log.d("Clima", "Success! JSON : " + response.toString());

                WeatherDataModel weatherData = WeatherDataModel.fromJSON(response);

                // Log.d("Clima", weatherData.getTemperature()); << WORKING

                updateUI(weatherData);
            }

            @Override
            public void onFailure(int statusCode, Header[] header, Throwable e, JSONObject response) {
                Log.e("Clima", e.toString());
                Log.d("Clima", String.valueOf(statusCode));
                Toast.makeText(WeatherController.this, "Request Failed!", Toast.LENGTH_SHORT).show();

            }

        });

    }


    // TODO: Add updateUI() here:
    private void updateUI(WeatherDataModel weatherData){

        mTemperatureLabel.setText(weatherData.getTemperature());
        mCityLabel.setText(weatherData.getCity());

        int resourceID = getResources().getIdentifier(weatherData.getIconName(), "drawable", getPackageName());
        mWeatherImage.setImageResource(resourceID);



    }


    // TODO: Add onPause() here:



}

What should I do to get the location as soon as the app starts?

P.S. permissions are in place so it isn't an issue of permissions.

Femn Dharamshi
  • 527
  • 1
  • 9
  • 25
  • 1
    Possible duplicate of [What is the simplest and most robust way to get the user's current location on Android?](https://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-on-a) – Sotiris S. Magionas Jul 11 '18 at 12:10
  • Maybe obvious, but always worth mentioning: if testing indoors, then GPS is very unlikely to work. And in any case finding the location will take some time. – Markus Kauppinen Jul 11 '18 at 12:54

1 Answers1

-5
    LocationManager locationManager =
    (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    Location location;

    if(networkEnabled){
        longitude=location.getLongitude();
        latitude=location.getLatitude();
      }
    }

Add these permissions in your manifest file:-

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Ankita
  • 1,129
  • 1
  • 8
  • 15
  • will i have to manually ask for permissions of COARSE LOCATION again if i already asked for permission of FINE LOCATION ? Also what about the permissions of NETWORK STATE ? will it be automatically loaded or i'll have to request manugally ? – Femn Dharamshi Jul 11 '18 at 12:16
  • Also to do `if(networkEnabled){ longitude=location.getLongitude(); latitude=location.getLatitude(); } }` wont the Location location need a value set to it ? – Femn Dharamshi Jul 11 '18 at 12:17
  • No. Try the above code once. Maybe it'll solve your problem. – Ankita Jul 11 '18 at 12:19
  • This code is missing something. It doesn't actually get the location in any way. And like suggested, there will be a NullPointerException. And in modern Android versions the permissions need to be requested at runtime. And it only gets an inaccurate location via the network provider. That's probably the reason for the downvote. – Markus Kauppinen Jul 12 '18 at 07:11