2017-10-19 1 views
0

Je demande la permission à l'intérieur de onActivityResult de mon activité et ce qui se passe est que mon activité est en pause pendant que la boîte de dialogue d'autorisation de demande est affichée. Pourquoi est-ce et puis-je en quelque sorte l'empêcher?La boîte de dialogue Demander une autorisation suspend mon activité

Tout ce que je fais est de demander la permission d'une manière normale:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || 
       ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 
         REQUEST_LOCATION_ACCESS_CODE); 
+0

"Pourquoi est-ce?" - vous démarrez une autre activité (la boîte de dialogue d'autorisation de demande). "Puis-je l'empêcher?" - n'utilisez pas les permissions 'dangerous', donc vous n'avez pas besoin d'appeler' requestPermissions() '. – CommonsWare

Répondre

2

ce qui se passe est que mon activité est interrompue alors que la demande d'autorisation de dialogue est affichée. Pourquoi donc?

requestPermissions docs says

This method may start an activity allowing the user to choose which permissions to grant and which to reject. Hence, you should be prepared that your activity may be paused and resumed. En outre, accordant certaines autorisations peut nécessiter un redémarrage de votre application. Dans dans un tel cas, le système va recréer la pile d'activités avant le pour livrer le résultat à votre onRequestPermissionsResult (int, String [], int []).

Bien qu'une autre solution est déplacer votre code dans onStop si possible et approprié

0

code source d'activité Méthode # requestPermissions:

public final void requestPermissions(@NonNull String[] permissions, int requestCode) { 
    if (requestCode < 0) { 
     throw new IllegalArgumentException("requestCode should be >= 0"); 
    } 
    if (mHasCurrentPermissionsRequest) { 
     Log.w(TAG, "Can reqeust only one set of permissions at a time"); 
     // Dispatch the callback with empty arrays which means a cancellation. 
     onRequestPermissionsResult(requestCode, new String[0], new int[0]); 
     return; 
    } 
    Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); 
    startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); 
    mHasCurrentPermissionsRequest = true; 
} 

On voit bien qu'une nouvelle activité est ouvert. Par conséquent dans l'activité d'appel sera sûrement appelé. Donc, c'est le comportement attendu . Si vous souhaitez empêcher la suspension de votre activité, assurez-vous de disposer des autorisations requises avant d'ouvrir cette activité.

Si votre activité est l'activité principale, ajoutez une activité splash. Sinon, vérifiez les autorisations avant d'ouvrir votre activité.