尝试实现一项功能,用户可以使用手机相机拍照,然后将其作为个人资料照片上传

问题描述 投票:0回答:1

我目前在我的应用程序上实现一项功能时遇到问题,即用户可以使用手机的相机拍摄照片,然后将其显示为位图图像并上传到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 + "%");
                    }
                });
    }
}
android firebase android-camera onactivityresult
1个回答
0
投票
[C0行]包含捕获图像的缩略图,但是由于某些原因,您完全忽略了它。
© www.soinside.com 2019 - 2024. All rights reserved.