Подтвердить что ты не робот

Диалоговое окно разрешения 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. Я не уверен, что это может быть связано.

У кого-нибудь есть идея, почему он не показывает?

4b9b3361

Ответ 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);