Android 6 Marshmallow: запросы на некоторые определенные разрешения мгновенно отклоняются без отображения пользовательского интерфейса.

Используя официальный AVD rev. 3

Вызов этого:

ActivityCompat.requestPermissions(activity, new String[]{"android.permission.USE_CREDENTIALS"}, REQUEST_PERMISSION_CREDENTIALS);

Срабатывает сразу:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

И результирующий код PackageManager.PERMISSION_DENIED

У кого-нибудь есть исправление?

ОБНОВЛЕНИЕ: Известно, что затронуты:

Manifest.permission.CHANGE_NETWORK_STATE
Manifest.permission.WRITE_SETTINGS (solved, see Sam's answer)
android.permission.USE_CREDENTIALS (solved, read Update 2)
READ_SMS

ОБНОВЛЕНИЕ 2: см. отличный принятый ответ. По сути, USE_CREDENTIALS теперь является безопасным разрешением. Удивительно, почему sdk просто не возвращает PERMISSION_GRANTED для этого...


person rothschild86    schedule 22.08.2015    source источник
comment
Вы видели диалог?   -  person Deividi Cavarzan    schedule 22.08.2015
comment
У вас есть разрешение, определенное в манифесте?   -  person yoah    schedule 22.08.2015
comment
@DeividiCavarzan нет диалога. onResult вызывается мгновенно   -  person rothschild86    schedule 22.08.2015
comment
@yoah хорошая мысль. но скопировал разрешение прямо из манифеста. он все еще там   -  person rothschild86    schedule 22.08.2015
comment
Вы решили? Я могу воспроизвести и здесь, но не нашел решения.   -  person Deividi Cavarzan    schedule 22.08.2015
comment
@DeividiCavarzan не решен. Я предполагаю, что это ошибка в библиотеке совместимости...   -  person rothschild86    schedule 23.08.2015
comment
@ rothschild86 Это странно, потому что Manifest.permission.ACCESS_COARSE_LOCATION работает нормально. Ваши и Manifest.permission.CHANGE_NETWORK_STATE и Manifest.permission.WRITE_SETTINGS не работают   -  person Deividi Cavarzan    schedule 23.08.2015
comment
@DeividiCavarzan ах, хорошая находка. поэтому разные разрешения следуют по разным логическим путям... интересно...   -  person rothschild86    schedule 23.08.2015
comment
@DeividiCavarzan только что заметил, что USE_CREDENTIALS даже нет в глобальном списке разрешений ... но те, которые вы упомянули, - они есть. developer.android.com/reference/android/   -  person rothschild86    schedule 23.08.2015
comment
Да, я дважды проверил, и все в порядке. Я буду исследовать больше об этом.   -  person Deividi Cavarzan    schedule 23.08.2015
comment
READ_SMS, кажется, тоже затронут.   -  person Roberto Betancourt    schedule 05.10.2015


Ответы (4)


См. следующие страницы: разрешения по уровням защиты и определения уровней защиты.

Манифест.разрешение.CHANGE_NETWORK_STATE

Манифест.разрешение.WRITE_SETTINGS

Они подпадают под уровень защиты signal|appop|pre23|preinstalled, что означает, что их могут иметь только приложения с одинаковой подписью (в основном подписанные системой), операторы приложений, приложения, предназначенные для уровня API ниже 23, и предварительно установленные приложения.

android.permission.USE_CREDENTIALS

Это необходимо только на уровне API 22 и ниже. См. это.

Также вам следует ознакомиться с изменениями поведения.

person Gergely Kőrössy    schedule 22.08.2015
comment
Похоже, что WRITE_SETTINGS можно предоставить с помощью специального меню в разделе «Приложения» на Android M. Если цель приложения ‹ 23, разрешение предоставляется по умолчанию, если цель приложения = 23, разрешение не предоставляется по умолчанию. Проблема в том, что с такими разрешениями файл checkSelfPermissions & co. вроде не работает. - person greywolf82; 23.08.2015
comment
Я думаю, что это нужно для того, чтобы пользователь мог отозвать это разрешение из приложений до 23. Поскольку вы не можете получить к нему доступ через API, не имеет значения, можете ли вы предоставить его в меню настроек. - person Gergely Kőrössy; 23.08.2015
comment
@ rotschild86 Итак, как вы это решили? Я продолжаю получать отказ в разрешении без диалога. - person Danpe; 16.10.2015
comment
@Danpe, с каким разрешением ты имеешь дело? - person rothschild86; 16.10.2015
comment
@Danpe кажется, это известная проблема: code.google.com/ p/android/issues/detail?id=189841, и, похоже, это еще не исправлено. Я использую разрешения Location, и диалоговое окно не появляется, хотя указано, что это опасное разрешение (см.: developer.android.com/guide/topics/security/). - person Darwind; 06.11.2015

Что касается WRITE_SETTINGS, CommonsGuy предоставил обходной путь здесь: https://stackoverflow.com/a/32083622/238753

person Sam    schedule 28.08.2015

Кажется, вы разобрались. У меня был такой же симптом с более глупой причиной.

У меня были узлы разрешений на использование ВНУТРИ моего узла приложения в моем манифесте. Похоже, это работало на 22 или меньше, но переход на 23, похоже, не распознал его и, таким образом, автоматически отклонил разрешение.

Надеюсь, это поможет кому-то еще застрять на этом.

person Joe    schedule 20.01.2016

сначала проверьте версию Marshmellow, затем вставьте ее в свой код после изменения имени действия.

if (!android.provider.Settings.System.canWrite(RingdroidEditActivity.this)) {
                    Intent intentt = new     Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intentt.setData(Uri.parse("package:" + RingdroidEditActivity.this.getPackageName()));
                intentt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intentt);
            }

Это приведет вас на страницу разрешений приложения и попросит пользователя дать разрешение

WRITE_SETTINGS после изменения зефира, это будет работать, чтобы увидеть пример, проверьте это приложение

person user3785621    schedule 22.11.2016