3
votes

Comment faire lorsque l'utilisateur rejette les autorisations dans l'application?

Je développe une application dont la fonction principale est de voir les données sur une carte.

Pour cela, j'ai besoin d'obtenir la position actuelle, et pour cela, je demande à l'utilisateur.

Mais si l'utilisateur refuse les autorisations, quelle est la meilleure façon de le redemander?

J'essaye de demander à nouveau dans onRequestPermissionsResult mais l'application plante.

Une idée?

Code:

private void enableMyLocationIfPermitted() {    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        if (mapViewModel.getGoogleMap() != null) {
            mapViewModel.getGoogleMap().setMyLocationEnabled(true);
        } else {
            Log.e(TAG, "No Google Map available in view model");
        }
     } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
     }

}

@Override
public void onMapReady(GoogleMap googleMap) {
    Log.d(TAG, "Map is ready");
    googleMap.setOnMarkerClickListener(this);
    googleMap.getUiSettings().setRotateGesturesEnabled(false);
    googleMap.getUiSettings().setMyLocationButtonEnabled(false);
    mapViewModel.setGoogleMap(googleMap);
    enableMyLocationIfPermitted();
    getLastLocationIfPermitted();
    mapViewModel.loadData();
}


@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case LOCATION_PERMISSION_REQUEST_CODE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    enableMyLocationIfPermitted();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
                Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
            }
            return;
         }

     }
}

Erreur:

java.lang.StackOverflowError: taille de la pile 8 Mo

Merci


2 commentaires

Partagez votre code et tracez la pile (du crash)


Partagez votre journal des pannes


3 Réponses :


2
votes

Si l'utilisateur refusait l'autorisation avec l'option "Ne plus jamais demander", votre méthode onRequestPermissionsResult s'appellerait elle-même pour toujours jusqu'à ce qu'elle lève StackOverFlowError .

La meilleure chose à faire voici de ne plus demander la permission dans la méthode onRequestPermissionsResult une fois que l'utilisateur la refuse. Vous pouvez plutôt désactiver la fonctionnalité ou ouvrir les paramètres d'autorisation de votre application et leur demander de modifier manuellement les paramètres d'autorisation à l'aide du code ci-dessous.

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case LOCATION_PERMISSION_REQUEST_CODE: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                enableMyLocationIfPermitted();
            } else {
                Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
            return;
        }

    }
}

Si vous souhaitez en savoir plus sur les autorisations https://developer.android.com/training/permissions/requesting ce est un bon guide.


6 commentaires

ok de toute façon, le crash se produit dans onLoad, et avant de pouvoir répondre


Supprimez simplement ActivityCompat.requestPermissions (this, new String [] {Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); de la méthode onRequestPermissionsResult


oui mais si je le supprime et que l'utilisateur rejette l'autorisation, quel est le meilleur moyen de le demander à nouveau?


Si votre application ne peut pas fonctionner sans l'autorisation, vous devez fermer l'application en 'finish (); `puis lorsque l'utilisateur la rouvrira, l'application se verra demander l'autorisation si" Ne plus jamais demander "n'est pas choisi.


@ Tlaloc-ES J'ai édité mon code avec une meilleure suggestion


Peut-être qu'une autre option peut être de relancer l'activité?, Merci pour tous



2
votes

StackOverflow -> Cela signifie généralement que vous avez un appel récursif dans votre code. La récursivité est simplement une méthode qui s'appelle elle-même, provoquant un débordement de la pile et lançant l'exception StackOverflow.

L'application ne demande probablement pas à nouveau à l'utilisateur si l'utilisateur refuse l'autorisation. Ensuite, ce flux se comporte comme une boucle à l'infini. Et vous obtenez un crash lorsque vous dépassez la taille de la pile


0 commentaires

1
votes

Si l'autorisation de rejet de l'utilisateur signifie que l'utilisateur ne voulait pas partager ses données avec votre application, alors pourquoi vous voulez le demander à plusieurs reprises, c'est ennuyeux pour l'utilisateur, vous mettez simplement un message pour faire savoir à l'utilisateur pourquoi vous êtes demander l'autorisation et en cas de refus, l'utilisateur ne peut pas utiliser une fonctionnalité spécifique de l'application, mais vous souhaitez toujours demander l'autorisation à plusieurs reprises, il vous suffit d'afficher la boîte de dialogue lorsque l'utilisateur refuse avec l'invite "Veuillez autoriser cette autorisation pour une utilisation ultérieure de l'application" et lorsque l'utilisateur appuie sur ok, affiche à nouveau la boîte de dialogue d'autorisation.


1 commentaires

Parce que c'est une fonctionnalité requise, je pense que la même chose a mis dans les paramètres une option, et peut-être que l'utilisateur rejette par erreur. car la seule fonctionnalité de l'application est de regarder une carte avec des données qui utilisent votre position.