Диалоговое окно разрешения Android M не отображается
в настоящее время я пытаюсь адаптировать свое приложение к новой модели разрешений Android M.
Я собираю все разрешения, которые мне нужны, а затем запускаю
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions содержит разрешения, которые мне нужны, как android.permission.WRITE_EXTERNAL_STORAGE
.
эта процедура определенно выполняется, поскольку у меня есть строка журнала в logcat:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
но диалог разрешений никогда не показывает, не говоря уже о вызове onRequestPermissionsResult ().
что я делаю не так? На основе некоторых учебников я обнаружил, что ничего не упускаю. У меня есть только эмулятор для тестирования, нет физического устройства. Это о экране из настроек: изображения
возможно, стоит упомянуть еще кое-что: если я попытаюсь открыть обзор установленных приложений с главного экрана, я получу только launcher3 has exited
. Я не уверен, что это может быть связано.
у кого-нибудь есть идея, почему он не показывает?
26 ответов:
Я испытал ту же проблему, но позже я понял, что забыл добавить разрешение в файл манифеста. После добавления тега uses-permission система отобразила диалоговое окно. Может быть, помогает кому-то.
это заняло весь мой день, чтобы выяснить, что вызвало проблему. Элемент оригинальный ответ помог мне.
я исправил, добавив
tools:remove="android:maxSdkVersion"
такой:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
Я испытал ту же проблему, потому что я использовал отрицательное значение в качестве REQUEST_CODE.
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
после использования положительного значения система показала диалоговое окно. Надеюсь, это кому-то поможет.
У меня просто была такая же проблема. Моя проблема заключалась в том, что я написал разрешение в неправильном месте в манифесте. Убедитесь, что разрешение uses находится вне приложения:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.android.gms.samples.vision.face.photo" android:installLocation="auto" android:versionCode="1" android:versionName="1" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:hardwareAccelerated="true" android:label="FacePhotoDemo" android:allowBackup="true" android:icon="@drawable/icon">
добавить
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в AndroidManifest.xml
Примечание : разрешение, которое вы хотите получить. Например: андроид.разрешение.ACCESS_FINE_LOCATION и др.
на основе комментария от Hilal (большое спасибо!): В моем случае мое приложение действительно использует tabhost, и разрешения были запрошены из действия внутри tabhost. После запуска отдельного действия, которое запрашивает разрешения, он работает.
Я также столкнулся с ситуацией, когда диалоговое окно разрешения не появляется или приложение аварийно завершает работу при использовании
<uses-permission-sdk23>
элемент, однако причиной, по-видимому, является системная ошибка на текущих устройствах 6.0:https://code.google.com/p/android/issues/detail?id=189841
авария исключение:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
У меня та же проблема, и проблема решается после добавления shouldShowRequestPermissionRationale следующим образом:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); }
в нашем коде, это была просто орфографическая ошибка.
у нас:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
должно быть:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Я сделал все, что было сказано в ответах выше, но все равно диалог не показывался, а затем я изменил
targetSdkVersion
до23
в gradle так и появилось . Надеюсь, это поможет кому-то
разрешения организованы в категории, поэтому некритические из них предоставляются без отображения диалогового окна.
Я нашел это трудный путь с разрешением интернета, Если у вас есть эта проблема, то изменение на критическое разрешение, такое как read_contacts, позволит вам проверить свой поток и выявить, является ли проблема разрешением некритическим или что-то еще.
чтобы добавить к ответу @shanraisshan,
REQUEST_CODE
на самом деле должен быть больше 0, а не только неотрицательным.
после поиска некоторое время кажется, что необходимо установить значение compileSdkVersion в "android-MNC" или на сегодняшний день до 23. Для этого требуется система сборки Gradle, которая затем, похоже, требует Android Studio. По крайней мере, я не мог найти ни одного руководства о том, как установить его вне файлов gradle.
@Override public final void validateRequestPermissionsRequestCode(int requestCode) { // We use 16 bits of the request code to encode the fragment id when // requesting permissions from a fragment. Hence, requestPermissions() // should validate the code against that but we cannot override it as we // can not then call super and also the ActivityCompat would call back to // this override. To handle this we use dependency inversion where we are // the validator of request codes when requesting permissions in // ActivityCompat. if (!mRequestedPermissionsFromFragment && requestCode != -1 && (requestCode & 0xffff0000) != 0) { throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); } }
была та же проблема. Позже я понял, что мы должны объявить каждое разрешение в манифесте (даже если одно является подклассом другого). В моем случае я заявил
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
в моем манифесте и пытался получить доступ к грубому местоположению пользователя.
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
Исправлена проблема, добавив грубое разрешение, а также в манифесте.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
в манифесте, я изменил
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22" />
до
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
может быть, это помогает.
было то же самое (я думаю) проблема и решение было удаление
import <app package>.Manifest;
autoimported Android Studio в верхней части файла и заменить его на
import android.Manifest;
и стал работать
в моем случае решение-это сама строка
android.разрешение.Контакты
Я действительно проявился.разрешение.READ_CONTACTS, которые вызвали ошибку тишины (отмечая шоу на экране).
убедитесь, что это правильно
Если у кого-то из вас есть приложение, которое изменяет / изменяет
WRITE_SETTINGS
и столкнулись с этой проблемой. Проверьте CommonsWare ответ на Write_settings неоднозначностья столкнулся с этой проблемой в течение 2 недель, а позже понял, что эта проблема была связана с тем, что
requestPermissions
не работает для запросаWRITE_SETTINGS
разрешения. Надеюсь, это поможет :D
в моем случае я запросил " ACCESS_COARSE_LOCATION "в моем файле манифеста, а затем запросил разрешение" ACCESS_FINE_LOCATION " в коде, поэтому диалоговое окно разрешения не открывалось.
Я делал два вызова requestPermissions (), один сразу за другим. Это сообщение об ошибке появилось в Logcat (обратите внимание на опечатку в "запросе"):
Can reqeust only one set of permissions at a time
requestPermissions () фактически предназначен для одновременного выполнения нескольких запросов; для этого и предназначен массив строк.
в моем случае разрешение, которое я запрашивал (WRITE_SETTINGS), было более специальным и требовало активности настроек для запуска. Так что диалог не появляется.
Я должен был получить его разрешение, используя следующий код:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);