J'utilise androidx.activity:activity:1.2.0-alpha8 lors de la demande d'autorisation avec le code

val request = registerForActivityResult(ActivityResultContracts.RequestPermission()) { res ->
    if (res != null && res) {
      // Permission granted, proceed
    } else {
      UiUtils.showToastSafe(this, R.string.necessary_permission_needed)
    }
}
request.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)

Cela s'est terminé par un plantage sur Huawei Mate10, avec la trace de la pile comme suit :

Failure delivering result ResultInfo{who=@android:requestPermissions:, request=65538, result=0, data=null} to activity {com.baicizhan.x.shadduck/com.baicizhan.x.shadduck.homepagePhone.PhoneHomepageActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0

androidx.activity.result.contract.ActivityResultContracts$RequestPermission in parseResult at line 265
androidx.activity.result.contract.ActivityResultContracts$RequestPermission in parseResult at line 251
androidx.activity.result.ActivityResultRegistry in doDispatch at line 313
androidx.activity.result.ActivityResultRegistry in dispatchResult at line 277
androidx.activity.ComponentActivity in onRequestPermissionsResult at line 597
androidx.fragment.app.FragmentActivity in onRequestPermissionsResult at line 579
android.app.Activity in dispatchRequestPermissionsResult at line 8567
android.app.Activity in dispatchActivityResult at line 8417
android.app.ActivityThread in deliverResults at line 5464
android.app.ActivityThread in handleSendResult at line 5512
...

Il semble que l'intention d'autorisation de demande ait été annulée et que l'activité enverrait un int[0] comme résultat (basé sur le code source de la plate-forme 29) :

private void dispatchRequestPermissionsResult(int requestCode, Intent data) {
    mHasCurrentPermissionsRequest = false;
    // If the package installer crashed we may have not data - best effort.
    String[] permissions = (data != null) ? data.getStringArrayExtra(
      PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0];
    final int[] grantResults = (data != null) ? data.getIntArrayExtra(
      PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0];
    onRequestPermissionsResult(requestCode, permissions, grantResults);
}

Et la partie d'analyse du résultat dans RequestPermission se déroule comme suit ...

@NonNull
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
    if (intent == null || resultCode != Activity.RESULT_OK) return false;
    int[] grantResults = intent.getIntArrayExtra(EXTRA_PERMISSION_GRANT_RESULTS);
    if (grantResults == null) return false;
    return grantResults[0] == PackageManager.PERMISSION_GRANTED;
}

Est-ce la raison pour laquelle j'ai eu ce crash ou est-ce que j'ai raté quelque chose ?

Voir aussi Réponse de Juan Cruz Soler à un autre crash similaire

1
DUAN 4 sept. 2020 à 06:52

1 réponse

Meilleure réponse

Conformément à ce problème, le code RequestPermission a été corrigé dans 1.2.0-alpha07 pour vérifier la longueur du tableau qui a été renvoyé. Veuillez passer à alpha07 ou supérieur.

1
ianhanniballake 4 sept. 2020 à 04:27