330 votes

La méthode OnActivityResult est dépréciée, quelle est l'alternative ?

J'ai récemment découvert que onActivityResult est déprécié. Que devons-nous faire pour le gérer ?

Une alternative introduite pour cela ?

Image showing code with onActivityResult striked out, indicating deprecation

1 votes

Si je l'enlève une erreur lint est apparue pour ajouter le super appel !

26 votes

Je ne sais pas s'il y a déjà eu une dépréciation qui n'a pas été dépréciée, mais j'ai bon espoir que startActivityForResult . Cette nouvelle façon de faire complique excessivement le code et en réduit la lisibilité.

57 votes

Google est le patron. Mais la façon dont ils continuent à changer les choses en peu de temps est frustrante.

1voto

BAHMAN Points 1256

Il semble que onActivityResult est déprécié dans la super classe, mais vous n'avez pas mentionné le nom de la super classe et le nom de l'utilisateur. compileSdkVersion ici dans votre question.

En Java et Kotlin, chaque classe ou méthode pouvait être marquée comme dépréciée en ajoutant simplement @Deprecated donc vérifiez votre super classe, vous pouvez étendre une mauvaise classe.

Lorsqu'une classe est dépréciée, toutes ses méthodes le sont également.

Pour voir une solution rapide, cliquez sur la méthode dépréciée et appuyez sur Ctrl+Q dans Android studio pour voir la documentation de la méthode, il devrait y avoir une solution pour cela.


Dans mon projet, j'utilise androidx et API 29 comme compileSdkVersion Cette méthode n'est PAS dépréciée dans les activités et les fragments.

2 votes

Puisque maintenant, dans le projet, utilisant androidx et API 29 comme compileSdkVersion, cette méthode est dépréciée aussi.

1voto

mazhar iqbal Points 71
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result.getResultCode() == Activity.RESULT_OK) {

                }
            }
        });

1voto

Narendra_Nath Points 586

Une autre façon de procéder est de procéder en 3 étapes. (En considérant que vous avez une startActivityForResult(0 et onActivityResult())

  1. créer une variable dans le formulaire var resultLauncher:ActivityResultLauncher<Intent>

  2. créez une fonction privée où vous initialisez le resultLauncher dans ce format de base

    resultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){result ->

    // copy paste the code from the onActivityResult replacing resultcode to result.resultCode

    if(result.resultcode==Activity.Result_OK){ val data=result.data // this data variable is of type intent and you can use it

    }else{ //code if you do not get the data } }

  3. Allez à la ligne avec startActivityForResult() et la remplacer par la ligne resultLauncher.launch(intent)

1voto

John Zhang Points 21

Si vous implémentez votre activité de base de cette manière, vous pouvez continuer à utiliser startActivityForResult à l'ancienne. La seule limitation est que vous devrez utiliser setResult(result, intent) pour définir le résultat dans votre activité. La clé est de laisser le résultat transporter le code de la requête vers le consommateur de résultat.

public class MyBaseActivity extends AppCompatActivity {
    private ActivityResultLauncher<Intent> activityLauncher;
    protected static String ACTIVITY_REQUEST_CODE = "my.activity.request.code";
    protected _originalIntent; 

    public void launchActivityForResult(Intent intent, int requestCode){
        intent.putExtra(UGM_ACTIVITY_REQUEST_CODE, requestCode);
        activityLauncher.launch(intent);
    }

    //
    //In order to be signature compatible for the rest of derived activities, 
    //we will override the deprecated method with our own implementation!
    //
    @SuppressWarnings( "deprecation" )
    public void startActivityForResult(Intent intent, int requestCode){
        launchActivityForResult(intent, requestCode);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    _originalIntent = getIntent();
        //set the default result
        setResult(Activity.RESULT_OK, _originalIntent);

        activityLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                Intent intent = result.getData();
                int requestCode = intent.getIntExtra(ACTIVITY_REQUEST_CODE, -1);
                MyBaseActivity.this.onActivityResult(requestCode, result.getResultCode(), intent);
            }
        });
    }

}

1voto

Sunday Points 1

Voici comment j'ai remplacé les requestCodes multiples (mettez ce code dans votre activité) :

    ActivityResultLauncher<Intent> launchCameraActivity = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent data = result.getData();
                    Bitmap photoBitmap;
                    if(data != null && data.getExtras() != null){
                        photoBitmap = (Bitmap) data.getExtras().get("data");
                        if (photoBitmap != null) {
                            dataModel.setPhoto(ImageUtil.convert(photoBitmap));
                            imageTaken.setVisibility(View.VISIBLE);
                            imageTaken.setImageBitmap(photoBitmap);
                        }

                    }
                }
            }
        });

ActivityResultLauncher<Intent> launchCameraAndGalleryActivity = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == Activity.RESULT_OK) {

                Intent data = result.getData();
                Uri imageUri;
                if (data != null) {
                    imageUri = data.getData();
                    InputStream imageStream;
                    try {
                        imageStream = getContentResolver().openInputStream(imageUri);
                        Bitmap photoBitmap = BitmapFactory.decodeStream(imageStream);
                        dataModel.setOtherImage(ImageUtil.convert(photoBitmap));
                        documentImageTaken.setVisibility(View.VISIBLE);
                        documentImageTaken.setImageBitmap(photoBitmap);
                    }catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    });

Je lance les activités comme ceci :

                    Intent photoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                launchCameraAndGalleryActivity.launch(photoIntent );

Intent galleryIntent= new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    launchCameraActivity.launch(galleryIntent);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X