Попытка реализовать функцию, при которой пользователь может использовать свою камеру телефона, чтобы сделать снимок, а затем он будет загружен в виде своего профиля - PullRequest
0 голосов
/ 25 апреля 2020

В настоящее время у меня возникла проблема с реализацией функции в моем приложении, где пользователь может сделать снимок с помощью камеры своего телефона, а затем отобразить его в виде растрового изображения и загрузить в Firebase.

Я видел ответы на несколько похожих вопросов, но, похоже, у меня ничего не работает, поэтому я надеялся, что кто-нибудь сможет взглянуть на мой код и понять, что я могу делать неправильно.

Мой общий процесс на данный момент заключается в том, что мой вариант «Выбрать из галереи» работает, а мой «Сделать фото» - нет. При щелчке в selectProfilePicOption () я могу сделать снимок и подтвердить его, но данные, отправленные в onActivityResult (), продолжают обнуляться. Я хочу иметь возможность передать снятую фотографию и загрузить ее в качестве растрового изображения в мою функцию uploadImageToFirebase ().

Заранее всем спасибо за любую помощь!

Вот мой текущий код:

private void selectProfilePicOption(Context context){
    final CharSequence[] options = {"Take Photo", "Choose from Gallery", "Cancel"};
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("Choose your profile picture");
    builder.setItems(options, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if(options[which].equals("Take Photo")){
                Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(takePicture, TAKE_IMAGE_REQUEST);

            }else if(options[which].equals("Choose from Gallery")){
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select image..."), PICK_IMAGE_REQUEST);
            }else if(options[which].equals("Cancel")){
                dialog.dismiss();
            }
        }
    });
    builder.show();
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_CANCELED) {
        switch (requestCode) {
            case TAKE_IMAGE_REQUEST:
                if(resultCode == RESULT_OK){
                    data.getExtras().get("data");
                    File file = new File(Environment.getExternalStorageDirectory().getPath());
                    Uri uri = Uri.fromFile(file);
                    try{
                        System.out.println("attempting to store bitmap");
                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                        uploadImageToFirebase(bitmap);
                    } catch (FileNotFoundException e){
                        e.printStackTrace();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
                break;
            case PICK_IMAGE_REQUEST:
                if (resultCode == RESULT_OK && data != null && data.getData() != null) {
                    filePath = data.getData();
                    try {
                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                        uploadImageToFirebase(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }
}



private void uploadImageToFirebase(final Bitmap bitmap){
    if(filePath != null){
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        StorageReference ref = mStorageRef.child("images/ProfilePics/" + mUser.getUid());
        ref.putFile(filePath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
                profilePicture.setImageBitmap(bitmap);
                Toast.makeText(SetProfileData.this, "Image Uploaded", Toast.LENGTH_SHORT).show();
            }
        })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        progressDialog.dismiss();
                        Toast.makeText(SetProfileData.this, "Failed " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) {
                        double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                        progressDialog.setMessage("Uploaded " + (int)progress + "%");
                    }
                });
    }
}

1 Ответ

0 голосов
/ 25 апреля 2020

Строка data.getExtras().get("data"); содержит эскиз вашего захваченного изображения, но по некоторым причинам вы полностью игнорируете его.

Сделайте это так,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_CANCELED) {
        switch (requestCode) {
            case TAKE_IMAGE_REQUEST:
                if(resultCode == RESULT_OK){
                    Bitmap bitmap = (Bitmap) intent.getExtras().get("data") //this line is important 
                      uploadImageToFirebase(bitmap);
                    } catch (FileNotFoundException e){
                        e.printStackTrace();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
                break;
            case PICK_IMAGE_REQUEST:
                if (resultCode == RESULT_OK && data != null && data.getData() != null) {
                    filePath = data.getData();
                    try {
                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                        uploadImageToFirebase(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }

Но остерегайтесь Миниатюра изображения, полученная вами на onActivityResult() и загруженная на FireBase, - это не изображение с полным разрешением, а просто сжатая версия. Чтобы получить полноразмерное изображение, вы можете проверить этот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...