Android предоставил моему приложению разрешения во время выполнения, не спрашивая

Я пытаюсь протестировать разрешения во время выполнения специально для Android sdk> 23. Но моему приложению автоматически предоставляются разрешения без запроса.

Примечание. Я использую SDK версии 24. Вот фрагмент кода, который я использую:

public void onCalendarClick(View view) {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) == PackageManager
            .PERMISSION_DENIED) {
       if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_CALENDAR)) {
            //Display Explanation to the user
            //For granting permissions to the app.
        }
        else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALENDAR}, CALLBACK_CALENDAR);
        }
    }
}

@Override
public void onRequestPermissionsResult(int resultCode, String permission[], int grantResults[]) {
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        Toast toast;
        switch (resultCode) {
            case CALLBACK_CALENDAR : toast = Toast.makeText(this,"Calendar Permission Granted!!",Toast.LENGTH_LONG);
                toast.show(); break;
            //Other Cases
        }
    }
}

Когда я нажимаю Calendar Button, запускается метод onCalendarClick(), но без запроса разрешения приложение сразу отображает Разрешение на доступ к календарю предоставлено!! toast. В настройках приложения отображается сообщение Разрешения не предоставлены/запрошены.

Я что-то упускаю или делаю не так? Спасибо за любую помощь.


person Robin    schedule 05.06.2017    source источник
comment
Вы спрашиваете, является ли requestCode КАЛЕНДАРЕМ, но не действительно ли он предоставлен, вы должны проверить значения разрешения [] и GrantResults [], чтобы узнать, предоставлено ли оно или нет.   -  person Jonathan Aste    schedule 05.06.2017
comment
Если я не ошибаюсь, я думаю, что в методе onRequestPermissionsResult(...) есть if condition проверка, предоставлены разрешения или нет. @ДжонатанАсте   -  person Robin    schedule 05.06.2017
comment
Какой у тебя targetSdkVersion?   -  person CommonsWare    schedule 05.06.2017
comment
Это sdk version 24 @CommonsWare   -  person Robin    schedule 05.06.2017
comment
Попробуйте выполнить полное удаление и переустановку приложения. Возможно, при более раннем тестировании вы предоставили разрешение.   -  person CommonsWare    schedule 05.06.2017
comment
Если вы уже предоставили разрешение, вам нужно перейти в «Информация о приложении» -> «Разрешения» и отменить выбор разрешения, которое вы предоставили ранее.   -  person Jonathan Aste    schedule 05.06.2017
comment
Он не запрашивал разрешения ни на эмуляторе, ни на физическом устройстве, работающем на Android 7.0. Что касается настроек приложения, я дважды проверил, разрешений нет, но мое приложение по-прежнему ведет себя так, как будто у него есть разрешения @JonathanAste   -  person Robin    schedule 05.06.2017
comment
Проверьте мой ответ, что может произойти, так это то, что вы получаете разрешения для другого запроса, потому что вы сначала запрашиваете массив GrantResults, хотя вы не уверены, какое это разрешение.   -  person Jonathan Aste    schedule 05.06.2017


Ответы (2)


Итак, вот оно. Я обнаружил, что для Android sdk > 22 хотя разрешения во время выполнения добавляются для вашего приложения программно, но вам все равно нужно объявить разрешение вашего приложения в файле AndroidManifest.xml. Итак, после добавления кода:

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

в AndroidManifest.xml приложение запрашивает разрешение и, наконец, работает. Для получения дополнительной информации: Диалоговое окно разрешений Android M не отображается. Спасибо всем за помощь. я вон)

person Robin    schedule 05.06.2017

Вам не хватает порядка кода. Проверь это:

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
    switch (requestCode) {
        case CALLBACK_CALENDAR: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // calendar-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Есть небольшая разница: вы спрашиваете, предоставлено ли разрешение, даже до того, как узнаете, что говорите о разрешениях КАЛЕНДАРЯ. Таким образом, вы должны сначала проверить, является ли текущий ответ разрешения тем, который вам нужен, а затем проверить, предоставлено ли разрешение.

Источник: https://developer.android.com/training/permissions/requesting.html< /а>

person Jonathan Aste    schedule 05.06.2017