Диалоговое окно разрешения 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 55

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"
     />

может быть, это помогает.

добавить разрешение в манифест файл, а также.

задание targetSdkVersion до 22.

было то же самое (я думаю) проблема и решение было удаление

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);

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

Я должен был сделать Build - > Clean Project а то Build - > Rebuild Project. Я думаю, Android Studio не заметил изменений, которые я сделал в манифесте.

измените конечное значение константы на 1.

private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);