I get user's location by FusedLocationProviderClient.getLastLocation() but only when user has already turn on location. like: https://i.stack.imgur.com/paQKO.png
If location is off,I get null.
In app settings it shows that location permission is granted!!
Help to get not null current location.
public class SelectGroup extends AppCompatActivity
implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener{
private static final String FINE_LOCATION = android.Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COARSE_LOCATION = android.Manifest.permission.ACCESS_COARSE_LOCATION;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
protected static final int REQUEST_CHECK_SETTINGS = 0x1;
private GoogleApiClient mGoogleApiClient;
private Boolean mLocationPermissionGranted = false;
private FusedLocationProviderClient mFusedLocationProviderClient;
private static final String TAG = "SelectGroup";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: starts");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_group);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
getLocationPermission();
}
//calling getDeviceLocation()
private void init(){
Log.d(TAG, "init: starts");
if (mLocationPermissionGranted) {
Log.d(TAG, "init: calling getDeviceLocation");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "init: returning");
return;
}
getDeviceLocation();
}
}
private void getDeviceLocation() {
Log.d(TAG, "getDeviceLocation: getting devices current location");
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
try {
if (mLocationPermissionGranted) {
Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
Log.d(TAG, "onComplete: found location");
Location currentLocation = (Location) task.getResult();
//LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
Log.d(TAG, "onComplete: currentlocation is " + currentLocation);
if(currentLocation !=null) {
double lat = currentLocation.getLatitude();
double lon = currentLocation.getLongitude();
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
SharedPreferences.Editor editor = pref.edit();
editor.putString("lat", lat + "");
editor.putString("lon", lon + "");
editor.apply();
Log.d(TAG, "onComplete: lat,lon : " + lat + "," + lon);
}
else {
Log.d(TAG, "onComplete: inside else where currentlocation is null");
settingsrequest();
Log.d(TAG, "onComplete: after settingsrequest");
double lat = currentLocation.getLatitude();
double lon = currentLocation.getLongitude();
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
SharedPreferences.Editor editor = pref.edit();
editor.putString("lat", lat + "");
editor.putString("lon", lon + "");
editor.apply();
}
}
}
});
}
} catch (SecurityException e) {
Log.e(TAG, "getDeviceLocation: SecurityException " + e.getMessage());
}
}
//calling init() after complete
private void getLocationPermission(){
String permissions[] = {android.Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
Log.d(TAG, "getLocationPermission: before if condition");
if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
mLocationPermissionGranted = true;
Log.d(TAG, "getLocationPermission: calling init");
init();
}else {
ActivityCompat.requestPermissions(this,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
}else {
ActivityCompat.requestPermissions(this,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
}
//calling init() after complete
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
mLocationPermissionGranted = false;
switch (requestCode){
case LOCATION_PERMISSION_REQUEST_CODE:{
if(grantResults.length > 0){
for(int i=0; i<grantResults.length;i++){
if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
mLocationPermissionGranted = false;
return;
}
}
mLocationPermissionGranted = true;
Toast.makeText(this, "Permission Granted : OnRequest", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onRequestPermissionsResult: calling init");
init();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
//startLocationUpdates();
Log.d(TAG, "onActivityResult: Result Ok");
Toast.makeText(this, "Request : Result Ok", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
//settingsrequest();//keep asking if imp or do whatever
Log.d(TAG, "onActivityResult: Result cancelled");
Toast.makeText(this, "Request : Result cancelled", Toast.LENGTH_SHORT).show();
break;
}
break;
}
}
@Override
protected void onStart() {
super.onStart();
settingsrequest();
}
public void settingsrequest()
{
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true); //this is the key ingredient
PendingResult<LocationSettingsResult> 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 state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can initialize location
// requests here.
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(SelectGroup.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
Toast.makeText(SelectGroup.this, "Error Occured", Toast.LENGTH_SHORT).show();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
});
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d(TAG, "onConnected: called");
}
@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended: called");
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed: called");
}
}
I tried https://stackoverflow.com/a/38264716/8018480 but don't understand how to make it possible!