Code for retrieving location not executing even after asking for permission in android marshmallow

223 Views Asked by At

I'm trying to retrieve user's current location using this library.

The code is fetching the location successfully in versions below android M, but when I am launching the app on devices with Android Marshmallow, the piece of code is not getting executed even!

I have written this code in the onCreate() method:

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
locationProvider.getLastKnownLocation()
        .subscribe(new Action1<Location>() {
            @Override
            public void call(Location location) {
                currentLatDouble = location.getLatitude();
                currentLngDouble = location.getLongitude();
                Toast.makeText(getBaseContext(), "User's location retrieved using library", Toast.LENGTH_SHORT).show();
            }
        });

Upon running the app on android marshmallow devices, I'm not getting this toast: Toast.makeText(getBaseContext(), "User's location retrieved using library", Toast.LENGTH_SHORT).show(); which means that this code is not getting executed!

Before writing this code, I have asked for permission using the code below:

int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
        & ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)
        & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
        & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_SETTINGS);

if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_SETTINGS) != 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.
        if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
                && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_SETTINGS)) {
            showMessageOKCancel("You need to allow access to few permissions so that the app can work as expected.",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                                 Manifest.permission.ACCESS_FINE_LOCATION,
                                                 Manifest.permission.ACCESS_COARSE_LOCATION,
                                                 Manifest.permission.WRITE_SETTINGS},
                                    REQUEST_RUNTIME_PERMISSION);
                        }
                    });
            return;
        }
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                                                          Manifest.permission.ACCESS_FINE_LOCATION,
                                                                          Manifest.permission.ACCESS_COARSE_LOCATION,
                                                                          Manifest.permission.WRITE_SETTINGS},
                REQUEST_RUNTIME_PERMISSION);
        return;
    }
}

Here's onRequestPermissionsResult()'s code:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_RUNTIME_PERMISSION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
                locationProvider.getLastKnownLocation()
                        .subscribe(new Action1<Location>() {
                            @Override
                            public void call(Location location) {
                                currentLatDouble = location.getLatitude();
                                currentLngDouble = location.getLongitude();
                                Toast.makeText(getBaseContext(), "User's location retrieved using library", Toast.LENGTH_SHORT).show();
                            }
                        });
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (currentLatDouble != null || currentLngDouble != null ) {
                            retrieveHRequests();
                            retrieveUserCounterA();
                            retrieveUserCounterP();
                        } else {
                            ifLocationAvailable();
                        }
                    }
                }, 2000);
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT)
                        .show();
                //helpRequestsLoadingDialog.dismiss();
                progressBarLoadingRequests.setVisibility(View.INVISIBLE);

                ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
                locationProvider.getLastKnownLocation()
                        .subscribe(new Action1<Location>() {
                            @Override
                            public void call(Location location) {
                                currentLatDouble = location.getLatitude();
                                currentLngDouble = location.getLongitude();
                                Toast.makeText(getBaseContext(), "User's location retrieved using library", Toast.LENGTH_SHORT).show();
                            }
                        });
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (currentLatDouble != null || currentLngDouble != null ) {
                            retrieveHRequestWrapper();
                            retrieveUserInfo();
                        } else {
                            ifLocationAvailable();
                        }
                    }
                }, 2000);
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

I have written the location retrieving code even in onRequestPermissionResult()'s PERMISSION_GRANTED case, but nothing is happening and no location getting retrieved in android marshmallow version!

Please let me know what's going wrong here!

0

There are 0 best solutions below