web-dev-qa-db-fra.com

ActivityCompat.requestPermissions ne montrant pas la boîte de dialogue

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

j'essaie d'utiliser cette fonction sur Nexi 5 Api 23 et sa ne me montre tout simplement pas la boîte de dialogue comme si elle était supposée le faire, cela ne fait rien .. .. qu'est-ce qui pourrait causer le problème? (Ce code est dans l’activité Java) J’ai essayé de changer mon api minimum à 23 et d’utiliser requestPermissions () sans ActivityCompat mais ne fonctionne toujours pas.

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'
}

et le manifeste:

<?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

Voici un exemple d'utilisation de requestPermissions():

Définissez d’abord l’autorisation (comme vous l’avez fait dans votre message) dans le manifeste, sinon votre demande sera automatiquement refusée:

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

Ensuite, définissez une valeur pour gérer le rappel d’autorisation, dans onRequestPermissionsResult (): 

private final int REQUEST_PERMISSION_PHONE_STATE=1;

Voici le code pour appeler 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();
    }
}

Tout d'abord, vous vérifiez si vous avez déjà une autorisation (souvenez-vous que même après avoir obtenu l'autorisation, l'utilisateur peut révoquer ultérieurement l'autorisation dans les paramètres de l'application.) 

Et enfin, voici comment vérifier si vous avez reçu ou non l'autorisation:

@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

J'ai eu le même problème et il s'est avéré être dû à l'outil de fusion manifeste en tirant un attribut Android:maxSdkVersion à partir d'une dépendance.

Pour afficher les autorisations réelles que vous demandez dans votre APK, vous pouvez utiliser l'outil aapt, comme ceci:

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

dans mon cas, il a imprimé:

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

même si je n’avais pas spécifié une maxSdkVersion dans mon manifeste. J'ai résolu ce problème en remplaçant <uses-permission> dans mon manifeste par:

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

(où l'espace de nom des outils est http://schemas.Android.com/tools)

29
hrunk

Espérons que cela aide les autres.

J'avais besoin de demander l'autorisation pour WRITE_EXTERNAL_STORAGE, mais je n'avais pas de fenêtre contextuelle malgré toutes les suggestions suggérées.

Le coupable à la fin était HockeyApp. Il utilise la fusion de manifestes pour inclure sa propre autorisation pour WRITE_EXTERNAL_STORAGE, à la différence qu’il applique une version max de sdk.

Le moyen de contourner ce problème est de l'inclure dans votre fichier Manifest, mais avec un remplacement contre celui-ci, pour remplacer la version et le succès de HockeyApp!

4.7.2 Autres dépendances demandant l’autorisation de stockage externe (SDK version 5.0.0 et ultérieure) Pour être prêt pour Android O, HockeySDK-Android 5.0.0 et versions ultérieures limitent le WRITE_EXTERNAL_STORAGE permission avec le filtre maxSdkVersion. Dans certains cas d'utilisation, par exemple . lorsqu'une application contient une dépendance qui nécessite cette autorisation, maxSdkVersion, il est impossible pour ces dépendances à accorder ou demander la permission. La solution à ces cas est la suivante:

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

Cela causera que d'autres attributs de faible les manifestes prioritaires seront remplacés au lieu d'être fusionnés.

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

18
Talha

Remplacer:

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

avec:

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

La chaîne utilisée pour cette autorisation n'est pas "Manifest.permission.READ_PHONE_STATE". Utilisez le symbole Manifest.permission.READ_PHONE_STATE.

8
CommonsWare

J'ai mis à jour ma version cible du SDK de 22 à 23 et cela a parfaitement fonctionné.

4
Shyam Sunder

Ce ne pourrait pas être un problème avec une seule ligne de votre code.

Sur certains appareils (je ne me souviens pas s'il s'agit d'Android en stock), la boîte de dialogue Autorisation comprend une case à cocher intitulée "Ne plus demander". Si vous cliquez sur Refuser avec la case cochée, cette autorisation ne vous sera plus demandée. Cette application sera automatiquement refusée. Pour revenir sur cela, vous devez aller dans Paramètres -> App -> Autorisations et réactiver cette perm pour l'application. Puis éteignez-le pour le nier à nouveau. Vous devrez peut-être ouvrir l'application avant de l'éteindre à nouveau, pas sûr.

Je ne sais pas si votre Nexus l'a. Cela vaut peut-être la peine d'essayer.

2
androidguy

Pour moi, le problème était de demander un groupe par erreur au lieu des autorisations réelles.

1
Meanman

J'avais le même problème et je l'ai résolu en remplaçant Manifest.permission.READ_PHONE_STATE par Android.Manifest.permission.READ_PHONE_STATE.

1
Beaux

Cela m'est juste arrivé. Il s'est avéré que je demandais TOUTES les autorisations, lorsque j'ai eu besoin de filtrer uniquement les autorisations DANGEREUSES, et cela a soudainement commencé à fonctionner.

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

Les informations ci-dessus sont bonnes, mais définir targetSdkVersion sur 23 (ou plus) est critical pour Android à interpréter la balise <uses-permission> du manifeste comme "Je demanderai dans le code" au lieu de "Je le demande lors de l'installation". Beaucoup de sources vous diront que vous avez besoin de la balise <uses-permission>, mais personne ne dit pourquoi et si vous n'avez pas cette valeur définie, vous serez aussi confus que moi pendant des heures.

0
Eliot Gillum

il m'est arrivé de l'exécuter sur l'API 23 et je devais utiliser le code pour demander une autorisation comme celle ci-dessous le mettre sur la méthode create. Notez que MY_PERMISSIONS_REQUEST_READ_LOCATION est un entier égal à 1 exemple. Int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1:

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.M) { requestPermissions (new String [] {Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_READ_LOCATION); }

0
Jair Martinez

Peut-être que cette solution pourrait aider n'importe qui Plutôt que:

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

utilisation :

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

donc on ajoute Android. à Manifest.permission.WRITE_EXTERNAL_STORAGE

0
user10955646

Pour moi, le problème était que j'avais un code de demande invalide. J'ai choisi 0xDEADBEEF comme code de requête et il échouait silencieusement (il est peut-être converti en quelque chose de plus petit que 32 bits en interne?) Si j'ai choisi 255, tout a bien fonctionné comme NightSkyDev décrit ci-dessus.

0
griffin2000

Pour moi, le problème était que juste après avoir fait la demande, mon activité principale a lancé une autre activité. Cela a remplacé le dialogue, de sorte qu'il n'a jamais été vu.

0
JohnT

Pour moi, l'erreur était dans le manifeste: la permission était en majuscule. Android Studio me suggère les autorisations en majuscule. Je m'en fiche et il m'a fallu deux heures pour résoudre ce problème.

La syntaxe correcte pour l'autorisation est 
<uses-permission Android: name = "Android.permission.WRITE_EXTERNAL_STORAGE" />

0
AlainPre

J'ai eu ce même problème.J'ai mis à jour à buildToolsVersion "23.0.3" Tout d'un coup, a travaillé. J'espère que cela aide tous ceux qui ont ce problème.

0
Bk245

Je suis tombé sur ce problème dans Samsung S8 et N8 (ne se trouve dans aucun autre)

donc le problème est dans le fichier manifeste uses-permission

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

Pour une raison quelconque, l'attribut Android:requiredFeature est le coupable. et je n'ai pas trouvé l'explication sur pourquoi.

pour résoudre simplement le supprimer,

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