I am trying to develop an android application that gets the device latitude
and longitude using GPS or Network providers, whichever is available for
the process. The code works perfectly fine when the device's GPS is on but
unfortunately it never works when the device's GPS is switched off.
I want to get the device's latitude and longitude based on the available
providers, for example; if device's GPS is on it should get the device's
latitude and longitude using GPS provider and if the GPS is switched off it
should get the device's latitude and longitude using the network provider.
In my case the network provider always returns false and only works when
the device's GPS is switched on where as it should not bother about the
device GPS to be on or off it should simply get the latitude and longitude
based on network provider.
I have used the fused API from Google but even that has the same issue, I
can only get the latitude and longitude using GPS provider and when I turn
off the device's GPS it never returns the required latitude and longitude
using network provider because network provider and GPS providers both
returns false when device's GPS is switched off.
Both GPS and network provider is working on device's GPS, I want to
separate their process respectively.
I am using following permissions and features
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-feature android:name="android.hardware.location"
android:required="true"/>
<uses-feature android:name="android.hardware.location.network"
android:required="true"/>
<uses-feature android:name="android.hardware.location.gps"
android:required="true"/>
Following is my complete Java code that only works when device's GPS is on, in
both GPS and network cases.
package com.example.administrator.locationgetter;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
public static final int MY_PERMISSIONS_REQUEST = 0;
LocationManager locationManager;
private LocationListener mLocationListener;
private void showStatus(String st)
{
Toast.makeText(MainActivity.this,st,Toast.LENGTH_SHORT).show();
}
private LocationListener createLocationListener() {
return new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location
provider.
Toast.makeText(MainActivity.this,"accuracy: " +
location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " +
location.getLongitude(),Toast.LENGTH_SHORT).show();
}
public void onStatusChanged(String provider, int status, Bundle
extras) {
showStatus(provider + " -- " + status);
}
public void onProviderEnabled(String provider) {
showStatus(provider + " -- " + "ENABLED!");
}
public void onProviderDisabled(String provider) {
showStatus(provider + " -- " + "DISABLED!");
}
};
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//setSupportActionBar(toolbar);
mLocationListener = createLocationListener();
FloatingActionButton fab = (FloatingActionButton)
findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
locationManager = (LocationManager)
this.getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
mLocationListener);
} else {
Toast.makeText(MainActivity.this, "So sad! Give me the damn
permissions!", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
public void btnLocation(View v) {
if ((ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) || (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
)){
showStatus("Give me the permissions man!");
ActivityCompat.requestPermissions(this,
new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST);
}
else
{
showStatus("Already have permission");
locationManager = (LocationManager)
this.getSystemService(LOCATION_SERVICE);
String locationProvider = LocationManager.NETWORK_PROVIDER;
Location location =
locationManager.getLastKnownLocation(locationProvider);
if(location != null)
{
Toast.makeText(MainActivity.this,"accuracy: " +
location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " +
location.getLongitude(),Toast.LENGTH_SHORT).show();
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
mLocationListener);
}
}
public void btnLocation1(View v) {
if ((ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) || (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
)){
showStatus("Give me the permissions man!");
ActivityCompat.requestPermissions(this,
new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST);
}
else
{
showStatus("Already have permission");
locationManager = (LocationManager)
this.getSystemService(LOCATION_SERVICE);
String locationProvider = LocationManager.GPS_PROVIDER;
Location location =
locationManager.getLastKnownLocation(locationProvider);
if(location != null)
{
Toast.makeText(MainActivity.this,"accuracy: " +
location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " +
location.getLongitude(),Toast.LENGTH_SHORT).show();
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
mLocationListener);
}
}
}
I have tested the application on KitKat, Lollipop and Marshmallow, all have
the same results.
If you download the baidu maps and launch the app it will ask you to grant
the permission for location access, just make sure that your location is
turned off and simply grant the location permission to baidu map you will
notice that it will point your location on baidu maps even if your gps or
location service is off.
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/3e3f44cf-4ac7-4580-8b89-b3b99d914ec9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.