Dans mon application, j'ai créé un code indiquant que lorsque je choisis une image dans la galerie ou la caméra, l'image doit être envoyée sur le chat, mais lorsque je le fais, l'application revient sur l'activité de chat sans l'image envoyée. Ci-dessous, le code que j'ai créé:

sendMedia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //check if storage permission exists
                if (!checkStoragePermission()) {
                    requestStoragePermission();
                }else {
                    pickFromGallery();
                }
            }
        });

        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //check if camera permission exists
                if (!checkCameraPermission()) {
                    requestCameraPermission();
                }else {
                    pickFromCamera();
                }
            }
        });

private void pickFromGallery() {
        //pick from gallery
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, IMAGE_PICK_GALLERY_CODE);
    }

    private void pickFromCamera() {
        //open camera and pick image
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Images.Media.TITLE, "Temp Pick");
        contentValues.put(MediaStore.Images.Media.DESCRIPTION, "Temp Descr");
        imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, IMAGE_PICK_CAMERA_CODE);
    }

private void sendImageMessage(Uri imageUri) throws IOException {
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Sending Image.");
        progressDialog.show();

        String timeStamp = ""+System.currentTimeMillis();

        String filePath = "ChatImages/"+"post_"+timeStamp;

        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        byte[] data = byteArrayOutputStream.toByteArray();
        StorageReference reference = FirebaseStorage.getInstance().getReference().child(filePath);
        reference.putBytes(data)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressDialog.dismiss();
                        Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
                        while (!uriTask.isSuccessful());
                        String downloadUri = uriTask.getResult().toString();

                        if (uriTask.isSuccessful()) {
                            DatabaseReference reference1 = FirebaseDatabase.getInstance().getReference();

                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("sender", firebaseUser.getUid());
                            hashMap.put("receiver", userId);
                            hashMap.put("message", downloadUri);
                            hashMap.put("timestamp", timeStamp);
                            hashMap.put("type", "image");
                            hashMap.put("isseen", false);

                            reference1.child("chats").push().setValue(hashMap);

                            DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users").child(firebaseUser.getUid());
                            databaseReference.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot snapshot) {
                                    Users users = snapshot.getValue(Users.class);

                                    if (notify) {
                                    }
                                    notify = false;
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError error) {

                                }
                            });
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MessageActivity.this, "Failed to send image.", Toast.LENGTH_SHORT).show();
                    }
                });
    }

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case CAMERA_REQUEST_CODE: {
                if (grantResults.length>0) {
                    boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    if (cameraAccepted && storageAccepted) {
                        pickFromCamera();
                    }else {
                        Toast.makeText(this, "Camera and storage permissions should be accepted.", Toast.LENGTH_SHORT).show();
                    }
                }else {
                }
            }
            break;
            case STORAGE_REQUEST_CODE: {
                if (grantResults.length>0) {
                    boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    if (storageAccepted) {
                        pickFromGallery();
                    }else {
                        Toast.makeText(this, "Storage permissions should be accepted.", Toast.LENGTH_SHORT).show();
                    }
                }
            }
            break;
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_OK) {
            if (resultCode == IMAGE_PICK_GALLERY_CODE) {
                imageUri = data.getData();
                try {
                    sendImageMessage(imageUri);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else if (requestCode == IMAGE_PICK_CAMERA_CODE) {
                try {
                    sendImageMessage(imageUri);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

Eh bien, je pense qu'il y a un bogue sur requestCode de la méthode onActivityResult. Y a-t-il une autre façon de faire cela?

0
Achisyg 24 févr. 2021 à 23:17

2 réponses

Meilleure réponse

Vous avez foiré le code de requête et le code de résultat dans onActivityResult, en première ligne, vous comparez la requête et le résultat, ceux-ci ne seront jamais == (ou le seront toujours si IMAGE_PICK_GALLERY_CODE est défini sur -1 comme RESULT_OK est)

    if (requestCode == RESULT_OK) {
        if (resultCode == IMAGE_PICK_GALLERY_CODE) {

Certaines applications de caméra / galerie peuvent renvoyer un code de résultat erroné, tout en renvoyant également des données / images, il suffit donc de vérifier requestCode et la bonne charge utile dans data Intent

    if (requestCode == IMAGE_PICK_GALLERY_CODE && data!= null) {
        imageUri = data.getData();
        if (imageUri != null)
            ...rest of code
    else if (requestCode == IMAGE_PICK_CAMERA_CODE) {
        ...
1
snachmsm 24 févr. 2021 à 20:31

D'après mon expérience, onActivityResult est toujours appelé une fois que vous êtes revenu à votre activité depuis l'activité que vous avez ouverte à l'aide de startActivityForResult

Je crois que vous avez mélangé requestCode et resultCode. C'est le code de requête qui doit être IMAGE_PICK_GALLERY_CODE ou IMAGE_PICK_CAMERA_CODE.

Vous devez d'abord vérifier le code de la demande et ensuite seulement le code de résultat (peut-être qu'il y a des résultats personnalisés pour une demande spécifique).

De plus, je recommande d’ajouter des journaux juste après le démarrage de la fonction et d’imprimer tous les arguments pour faciliter le débogage.

Prendre plaisir :)

0
Shlomi Katriel 24 févr. 2021 à 21:00