Диалоговое окно разрешения 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
. Я не уверен, что это может быть связано.
У кого-нибудь есть идея, почему он не показывает?
Ответы
Ответ 1
На основе комментария от Хилала (спасибо большое!):
В моем случае мое приложение действительно использует tabhost, и разрешения запрашивались из Activity внутри tabhost. После запуска отдельного действия, которое запрашивает разрешения, он работает.
Ответ 2
У меня возникла одна и та же проблема, но позже я понял, что забыл добавить разрешение на файл манифеста. После добавления тега uses-permission система показала диалог. Может быть, помогает кому-то.
Ответ 3
У меня возникла такая же проблема, потому что я использовал отрицательное значение как REQUEST_CODE.
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
После использования положительного значения система отобразила диалог.
Надеюсь, это поможет кому-то.
Ответ 4
добавить
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в AndroidManifest.xml
Примечание. Разрешение, которое вы хотите получить. Например: android.permission.ACCESS_FINE_LOCATION и т.д.
Ответ 5
У меня была такая же проблема.
Моя проблема заключалась в том, что я написал разрешение в неправильном месте манифеста.
Убедитесь, что разрешения использования находятся вне приложения:
<?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">
Ответ 6
Мне потребовался целый день, чтобы узнать, что вызвало проблему. Первоначальный ответ помог мне здесь: fooobar.com/questions/122578/...
Я исправил добавлением tools:remove="android:maxSdkVersion"
следующим образом:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
Ответ 7
У меня такая же проблема, и проблема решена после добавления shouldShowRequestPermissionRationale следующим образом:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
Ответ 8
Я также столкнулся с ситуацией, когда диалоговое окно разрешения не появляется или приложение сбой при использовании элемента <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
Ответ 9
Я сделал все, что сказал в ответах выше, но диалог еще не показывался, а затем я изменил targetSdkVersion
на 23
в gradle и появился. Надеюсь, что это поможет кому-то.
Ответ 10
Разрешения организованы по категориям, поэтому некритические предоставляются без отображения диалогового окна.
Я нашел этот трудный путь с разрешением на доступ к Интернету, если у вас возникла эта проблема, а затем перейдя на критическое разрешение, такое как read_contacts, позволит вам протестировать поток и показать, является ли проблема некритичным, остальное.
Разрешения нормальной защиты указаны здесь
Ответ 11
Чтобы добавить к ответу @shanraisshan, значение REQUEST_CODE
должно быть больше 0, а не просто неотрицательно.
Ответ 12
В нашем коде это была простая орфографическая ошибка.
У нас было:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
Это должно быть:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Ответ 13
После некоторого времени поиска требуется установить значение compileSdkVersion в "android-MNC" или на сегодняшний день до 23. Это требует системы сборки Gradle, которая, как представляется, требует Android Studio.
По крайней мере, я не смог найти ни одного руководства о том, как установить его вне файлов Gradle.
Ответ 14
@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");
}
}
Ответ 15
Была та же проблема. Позже я понял, что мы должны декларировать каждое разрешение в манифесте (даже если оно является подклассом другого).
В моем случае я объявил
<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"/>
Ответ 16
В манифесте я изменил
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
к
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
Может быть, это помогает.
Ответ 17
Добавить разрешение в файл манифеста.
Ответ 18
Установите targetSdkVersion на 22.
Ответ 19
имела ту же проблему (я предполагаю), и решение удаляло
import <app package>.Manifest;
автоматически импортируется Android Studio в верхней части файла и заменяет его
import android.Manifest;
и начал работать
Ответ 20
В моем случае решение является самой строкой
android.permission.READ_CONTACTS
Я сделал Manifest.permission.READ_CONTACTS, который вызвал ошибку молчания (отмечая показ на экране).
Убедитесь, что это правильно.
Ответ 21
Если у кого-то из вас есть приложение, которое изменяет/изменяет WRITE_SETTINGS
и сталкивается с этой проблемой. Проверьте CommonsWare Ответ на WRITE_SETTINGS Неоднозначность
Я столкнулся с этой проблемой в течение 2 недель, а позже понял, что эта проблема связана с тем, что requestPermissions
не работает для запроса разрешения WRITE_SETTINGS
.
Надеюсь, это поможет: D
Ответ 22
В моем случае я запросил "ACCESS_COARSE_LOCATION" в моем файле манифеста, а затем запросил разрешение "ACCESS_FINE_LOCATION" в коде, почему Диалог разрешения не открывался.
Ответ 23
Я делал два вызова requestPermissions(), один за другим. Это сообщение об ошибке появилось в Logcat (обратите внимание на орфографию на "запрос" ):
Can reqeust only one set of permissions at a time
requestPermissions() фактически предназначен для одновременного выполнения нескольких запросов; что для массива String.
Ответ 24
Измените конечное значение константы на 1.
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);