1

I am trying to retrieve the location of the device and for some reason the location is not receiving. Can some one please check my code and let me know what is the mistake in the code. Thank you.

MainActivity

 public class MainActivity extends AppCompatActivity implements LocationListener {
    LocationManager locManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //get a reference to the location services to initialize the location manager object
        locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


        // Creating an empty criteria object
        Criteria criteria = new Criteria();

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.
            return;
        }

        // Get name of the provider in this case which would be gps
       // String provider = locManager.getBestProvider(criteria, false);

       // if (provider != null && !provider.equals("")) {
            // Get the location
          //  Location location = locManager.getLastKnownLocation(provider);


Location location = getLastKnownLocation();

        private Location getLastKnownLocation() {
            LocationManager mLocationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
            List<String> providers = mLocationManager.getProviders(true);
            Location bestLocation = null;
            for (String provider : providers) {
                Location l = mLocationManager.getLastKnownLocation(provider);
                if (l == null) {
                    continue;
                }
                if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
                    // Found best last known location: %s", l);
                    bestLocation = l;
                }
            }
            return bestLocation;
        }
            //set frequency of location update parameters
            locManager.requestLocationUpdates(provider, 120000, 10, this);

            if (location != null)
                onLocationChanged(location);
            else {
                TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude);
                tvLongitude.setText("Location can't be retrieved");
                Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show();
            }

     /*   } else {
            //create a toast indicating error.
            Toast.makeText(getBaseContext(), "OOPS something went wrong", Toast.LENGTH_SHORT).show();

        }*/
}


    public void onLocationChanged(Location location) {
        // text view for company caption
        TextView jackFruit = (TextView) findViewById(R.id.jack_fruit);
        // Get TextView curr_longitude
        TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude);

        // Getting TextView curr_latitude
        TextView tvLatitude = (TextView) findViewById(R.id.curr_latitude);

        // setting company caption
        jackFruit.setText("Jackfruit Systems: My current location");

        // Setting Current Longitude in the TextView
        tvLongitude.setText("Longitude:" + location.getLongitude());

        // Setting Current Latitude in the TextView
        tvLatitude.setText("Latitude:" + location.getLatitude());
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jackfruit.driverlocationinfo">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Gaurav Ram
  • 1,085
  • 3
  • 16
  • 32

2 Answers2

1

I tried an alternate method for sdk versions 23.

MainActivity

 @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
// calling location service via location manager
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        //calling location listener to get location coordinates on change of location
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                altitude = location.getAltitude();//calling altitude
                longitude = location.getLongitude();//calling longitude
                latitude = location.getLatitude();//calling latitude

                longitudeValue = Double.toString(longitude);//converting double longitude to string
                latitudeValue = Double.toString(latitude);//converting double latitude to string
                altitudeValue = Double.toString(altitude);//converting double altitude to string
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {
                //calling settings options in device when location is disabled
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        };
        // adding permissions for location service for api level 23
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.INTERNET
            }, 10);
            return;
        } else {
            //after above check start the method:
            locationConfiguration();
        }
}

    //another permission check if the first permissions miss any permission lib. packages
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 10:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                    locationConfiguration();
                return;
        }
    }


    //method to call location provider
    private void locationConfiguration() {
        provider = locationManager.getProvider(LocationManager.GPS_PROVIDER);
        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, locationListener);
        provider.supportsAltitude();

    }
Gaurav Ram
  • 1,085
  • 3
  • 16
  • 32
0

If you compile application for Android 6.0+, you need to request for permissions at runtime.

There is the code, that Android Studio suggest for the line Location location = locManager.getLastKnownLocation(provider);

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.
            return;
        }

And this is the link to the official documentation.

EDIT I've tried to run this code on my phone. This didn't work :) The code from that question helped me:

public class MainActivity extends AppCompatActivity implements LocationListener {
 LocationManager locManager;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);
  //get a reference to the location services to initialize the location manager object
  locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


  // Creating an empty criteria object
  Criteria criteria = new Criteria();

  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
   return;
  }

  // Get name of the provider in this case which would be gps
  // String provider = locManager.getBestProvider(criteria, false);

  // if (provider != null && !provider.equals("")) {
  // Get the location
  //  Location location = locManager.getLastKnownLocation(provider);


  Location location = getLastKnownLocation();


  //set frequency of location update parameters
  locManager.requestLocationUpdates(provider, 120000, 10, this);

  if (location != null)
   onLocationChanged(location);
  else {
   TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude);
   tvLongitude.setText("Location can't be retrieved");
   Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show();
  }

  /*   } else {
                //create a toast indicating error.
                Toast.makeText(getBaseContext(), "OOPS something went wrong", Toast.LENGTH_SHORT).show();

            }*/
 }

 private Location getLastKnownLocation() {
  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
   return;
  }
  LocationManager mLocationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
  List < String > providers = mLocationManager.getProviders(true);
  Location bestLocation = null;
  for (String provider: providers) {
   Location l = mLocationManager.getLastKnownLocation(provider);
   if (l == null) {
    continue;
   }
   if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
    // Found best last known location: %s", l);
    bestLocation = l;
   }
  }
  return bestLocation;
 }

 public void onLocationChanged(Location location) {
  // text view for company caption
  TextView jackFruit = (TextView) findViewById(R.id.jack_fruit);
  // Get TextView curr_longitude
  TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude);

  // Getting TextView curr_latitude
  TextView tvLatitude = (TextView) findViewById(R.id.curr_latitude);

  // setting company caption
  jackFruit.setText("Jackfruit Systems: My current location");

  // Setting Current Longitude in the TextView
  tvLongitude.setText("Longitude:" + location.getLongitude());

  // Setting Current Latitude in the TextView
  tvLatitude.setText("Latitude:" + location.getLatitude());
 }

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

 }

 @Override
 public void onProviderEnabled(String provider) {

 }

 @Override
 public void onProviderDisabled(String provider) {

 }
}

For me preferred provider was "gps", but it retursn null Location.

P.S. Sorry for the formatting. You can press Ctrl+Alt+L in Android Studio to format it properly.

Community
  • 1
  • 1
Artem Mostyaev
  • 3,874
  • 10
  • 53
  • 60