Код ниже работал для меня.

рвых, я знаю, что это дублирующий вопрос, но я перебрал ответы на другие подобные вопросы и не смог добиться успеха ни с одним из этих решений.

Я разработал приложение, которое отлично работает на моем тестовом устройстве - Samsung S4 под управлением Android L (5.0.1), однако я бы хотел, чтобы это приложение также работало на более новых версиях Android.

Я понимаю, что запрашиваемые разрешения для Android M + изменились, поэтому их нужно запрашивать во время выполнения, но когда я пытаюсь реализовать это, диалоговое окно никогда не появляется и, следовательно, никогда не запрашиваются необходимые разрешения.

Разрешение, которое я запрашиваю,ACCESS_FINE_LOCATION.

Вот соответствующий код из моего файла манифеста:

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

Где я спрашиваю разрешение, если оно еще не предоставлено:

if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

    startGeofenceMonitoring();

} else {
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}

Функция askForPermission (немного изменена по примеру Google):

private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {

            //This is called if user has denied the permission before
            //In this case I am just asking the permission again
            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);

        } else {

            Log.d(TAG, "askForPermission: " + permission);

            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
        }
    } else {
        Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
    }
}

И функция onRequestPermissionsResult:

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

    Log.d(TAG, "onRequestPermissionsResult: " + requestCode);

        switch (requestCode) {
            case 1:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.d(TAG, "onRequestPermissionsResult: request");

                    Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();

                    startGeofenceMonitoring();
                }
                break;
        }
}

Как я уже сказал, диалоговое окно, запрашивающее разрешения, никогда не появляется, но моя консоль сообщает мне, чтоActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCo,de); называется, и после долгих исследований я все еще не уверен, почему это не работает. Единственное, что, я думаю, может быть связано с тем, что это действие представляет собой действие фрагмента, отображающее карту Google Maps. Я попытался запросить разрешения в другом действии, но происходит то же самое.

Благодарю.

РЕДАКТИРОВАТЬ

Поэтому я только что протестировал код, который выложил здесь, в совершенно новом проекте, и он работал нормально и показал диалоговое окно. Теперь я действительно озадачен тем, что мешает отображению этого диалогового окна в моем текущем проекте.

Ответы на вопрос(3)

Ваш ответ на вопрос