it-swarm.com.ru

ActivityCompat.requestPermissions не показывает диалоговое окно

if (ContextCompat.checkSelfPermission(RegisterActivity.this,      Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE_PERMISSION);

я пытаюсь использовать эту функцию на Nexus 5 API 23, и она просто не показывает мне диалоговое окно, как это должно было быть, просто ничего не происходит .. что может вызвать проблему? (этот код находится в активности Java) Я попытался изменить минимальное значение API на 23 и использовать requestPermissions () без ActivityCompat, но все еще не работает.

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.example.idanayzen.photomap"
    minSdkVersion 23
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.google.Android.gms:play-services:8.4.0'
compile 'com.Android.support:design:23.1.1'
}

и манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.idanayzen.photomap">

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.READ_SMS" />

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">


    <meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="@string/google_maps_key" />

    <activity
        Android:name=".MapsActivity"
        Android:label="@string/title_activity_maps" />
    <activity Android:name=".RegisterActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity Android:name=".WrongPhoneNum"></activity>
</application>

</manifest>
45
Idan Ayzen

Вот пример использования requestPermissions():

Сначала определите разрешение (как вы указали в своем сообщении) в манифесте, в противном случае ваш запрос будет автоматически отклонен:

<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />

Затем определите значение для обработки обратного вызова разрешения в onRequestPermissionsResult (): 

private final int REQUEST_PERMISSION_PHONE_STATE=1;

Вот код для вызова requestPermissions ():

private void showPhoneStatePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.READ_PHONE_STATE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_PHONE_STATE)) {
            showExplanation("Permission Needed", "Rationale", Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        } else {
            requestPermission(Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        }
    } else {
        Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
    }
}

Сначала вы проверяете, есть ли у вас разрешение (помните, что даже после получения разрешения пользователь может позже отозвать разрешение в настройках приложения). 

И, наконец, вот как вы проверяете, получили ли вы разрешение или нет:

@Override
public void onRequestPermissionsResult(
        int requestCode,
        String permissions[],
        int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PERMISSION_PHONE_STATE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
            }
    }
}

private void showExplanation(String title,
                             String message,
                             final String permission,
                             final int permissionRequestCode) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title)
            .setMessage(message)
            .setPositiveButton(Android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    requestPermission(permission, permissionRequestCode);
                }
            });
    builder.create().show();
}

private void requestPermission(String permissionName, int permissionRequestCode) {
    ActivityCompat.requestPermissions(this,
            new String[]{permissionName}, permissionRequestCode);
}
74
NightSkyDev

У меня была та же проблема, и это, как оказалось, связано с манифестом инструмента слияния извлечения атрибута Android:maxSdkVersion из зависимости.

Чтобы просмотреть фактические разрешения, которые вы запрашиваете в вашем APK, вы можете использовать инструмент aapt, например:

/path/to/Android-sdk/build-tools/version/aapt d permissions /path/to/your-apk.apk

в моем случае это напечатало:

uses-permission: name='Android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18'

хотя я не указал maxSdkVersion в моем манифесте. Я исправил эту проблему, изменив <uses-permission> в моем манифесте на:

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="Android:maxSdkVersion"/>

(где пространство имен инструментов - http://schemas.Android.com/tools)

29
hrunk

Надеюсь, это поможет другим.

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

Виновником в итоге стал HockeyApp. Он использует объединение манифестов, чтобы включить свое собственное разрешение для WRITE_EXTERNAL_STORAGE, за исключением того, что он применяет к нему максимальную версию SDK.

Чтобы обойти эту проблему, включите ее в свой файл манифеста, но с заменой на него, чтобы переопределить версию и успех HockeyApp!

4.7.2 Другие зависимости, запрашивающие разрешение на внешнее хранилище (SDK версии 5.0.0 и более поздних версий) Для готовности к Android O, HockeySDK-Android 5.0.0 и более поздних версий ограничивают WRITE_EXTERNAL_STORAGE разрешение с фильтром maxSdkVersion. В некоторых случаях, например, . где приложение содержит зависимость, для которой требуется это разрешение maxSdkVersion делает невозможным предоставление этих зависимостей или запросить разрешение. Решение для этих случаев заключается в следующем:

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>

Это приведет к тому, что другие атрибуты от низкого приоритетные манифесты будут заменены вместо слияния.

https://support.hockeyapp.net/kb/client-integration-Android/hockeyapp-for-Android-sdk#permissions-advanced

18
Talha

Заменить:

ActivityCompat.requestPermissions(this, new String[]{"Manifest.permission.READ_PHONE_STATE"}, 225);

с:

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

Фактическая строка для этого разрешения не "Manifest.permission.READ_PHONE_STATE". Используйте символ Manifest.permission.READ_PHONE_STATE.

8
CommonsWare

Я обновил свою целевую версию SDK с 22 до 23, и она отлично работала.

4
Shyam Sunder

Это может быть не проблема с одной строкой вашего кода.

На некоторых устройствах (не помню, есть ли в наличии Android) диалоговое окно «Разрешения» включает флажок «Никогда не спрашивать». Если вы нажмете «Запретить» с установленным флажком, у вас больше не будет запрашиваться это разрешение, оно будет автоматически отклонено приложению. Чтобы это исправить, вам нужно зайти в «Настройки» -> «Приложение» -> «Разрешения» и снова включить эту разрешительную запись для приложения. Затем выключите его, чтобы снова отрицать. Возможно, вам придется открыть приложение, прежде чем снова его выключать, не уверен.

Я не знаю, есть ли у твоего Нексуса. Возможно стоит попробовать.

2
androidguy

Для меня проблема была в запросе группы по ошибке вместо фактических разрешений.

1
Meanman

У меня возникла та же проблема, и я решил ее, заменив Manifest.permission.READ_PHONE_STATE на Android.Manifest.permission.READ_PHONE_STATE.

1
Beaux

Это только что случилось со мной. Оказалось, что я запрашивал ВСЕ разрешения, когда мне нужно было фильтровать только ОПАСНЫЕ разрешения, и это внезапно начало работать.

fun requestPermissions() {
    val missingDangerPermissions = PERMISSIONS
            .filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
            .filter { this.getPackageManager().getPermissionInfo(it, PackageManager.GET_META_DATA).protectionLevel == PermissionInfo.PROTECTION_DANGEROUS } // THIS FILTER HERE!

    if (missingDangerPermissions.isNotEmpty()) {
        Log.i(TAG, "Requesting dangerous permission to $missingDangerPermissions.")
        ActivityCompat.requestPermissions(this,
                missingDangerPermissions.toTypedArray(),
                REQUEST_CODE_REQUIRED_PERMISSIONS);
        return
    } else {
        Log.i(TAG, "We had all the permissions we needed (yay!)")
    }
}
1
Benjamin H

Приведенная выше информация хороша, но установка targetSdkVersion в 23 (или выше) является критической для Android, чтобы интерпретировать тег <uses-permission> в манифесте как «Я буду просить в коде» вместо «Я требую при установке». Многие источники скажут вам, что вам нужен тэг <uses-permission>, но никто не говорит, почему, и если у вас не установлено это значение, вы будете так же запутаны, как и я, часами напролет.

0
Eliot Gillum

со мной случилось, что я запускал его на API 23, и мне пришлось использовать код, чтобы запросить разрешение, как этот код, приведенный ниже, на метод create. обратите внимание, что MY_PERMISSIONS_REQUEST_READ_LOCATION является целым числом, равным 1 примеру int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1:

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.M) { requestPermissions (новая строка [] {Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_READ_LOCATION); }

0
Jair Martinez

Может быть, это решение может помочь любому , А не:

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

использовать:

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

поэтому мы добавляем Android. в Manifest.permission.WRITE_EXTERNAL_STORAGE

0
user10955646

Для меня проблема заключалась в том, что у меня был неверный код запроса. Я выбираю 0xDEADBEEF в качестве кода запроса, и он молча терпел неудачу (может быть, он где-то внутри был приведен к чему-то меньшему, чем 32-битный?) Если я выбрал 255, все работало нормально, как описано выше в NightSkyDev.

0
griffin2000

Для меня проблема была в том, что сразу после выполнения запроса моя основная деятельность запустила другую деятельность. Это заменило диалог, поэтому его никогда не видели.

0
JohnT

Для меня ошибка была в манифесте: разрешение было в верхнем регистре. Android Studio предлагает мне разрешения в верхнем регистре. Меня это не волнует, и мне потребовалось два часа, чтобы решить эту проблему.

Правильный синтаксис для разрешения 
<использует-разрешение Android: name = "Android.permission.WRITE_EXTERNAL_STORAGE" />

0
AlainPre

У меня была такая же проблема. Я обновился до buildToolsVersion "23.0.3" Это неожиданно сработало. Надеюсь, что это помогает любому, кто имеет эту проблему.

0
Bk245

Я сталкивался с этой проблемой в Samsung S8 и N8 (не нашел ни в одном другом)

так что проблема в файле манифеста использования-разрешения

<uses-permission Android:name="Android.permission.CAMERA"
Android:requiredFeature="true" />

По какой-то причине, атрибут Android:requiredFeature является виновником. и я не нашел объяснения почему.

чтобы решить просто удалить его,

<uses-permission Android:name="Android.permission.CAMERA" />
0
grandia