В моем приложении я сделал код, который, когда я выбираю изображение из галереи или камеры, изображение должно быть отправлено в чат, но когда я это сделаю, приложение вернется в чат без отправки изображения. Ниже приведен код, который я сделал:

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();
                }
            }
        }
    }

Что ж, я думаю, что есть ошибка requestCode метода onActivityResult. Есть ли другой способ сделать это?

0
Achisyg 24 Фев 2021 в 23:17

2 ответа

Лучший ответ

Вы перепутали код запроса и код результата в onActivityResult, в первой строке вы сравниваете запрос и результат, они никогда не будут == (или всегда будут, если для IMAGE_PICK_GALLERY_CODE установлено значение -1 как RESULT_OK есть)

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

Некоторые приложения камеры / галереи могут возвращать неправильный код результата, но при этом возвращать также данные / изображения, поэтому проверки requestCode и правильной нагрузки в 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 Фев 2021 в 20:31

По моему опыту, onActivityResult всегда вызывается после того, как вы вернетесь к своей активности из активности, которую вы открыли с помощью startActivityForResult

Полагаю, вы смешали requestCode и resultCode. Это код запроса, который должен быть либо IMAGE_PICK_GALLERY_CODE, либо IMAGE_PICK_CAMERA_CODE.

Вы должны сначала проверить код запроса, а только потом код результата (возможно, есть собственные результаты для конкретного запроса).

Кроме того, я бы рекомендовал добавлять журналы сразу после запуска функции и распечатывать все аргументы для облегчения отладки.

Наслаждаться :)

0
Shlomi Katriel 24 Фев 2021 в 21:00