Java 如何从摄像头捕获图像并上传到Firebase

Java 如何从摄像头捕获图像并上传到Firebase,java,android,firebase,file-upload,firebase-storage,Java,Android,Firebase,File Upload,Firebase Storage,我正试图用相机拍一张照片并上传到Firebase。我正在使用AlertDialog询问用户是否要使用相机或从gallery中选择图像。我可以用相机拍照,但当我尝试上传图像时,它会说找不到图像 以下是我的图像选择方法: private void imageSelect(Context context) { final CharSequence[] options = { "Take Photo", "Choose from Gallery",

我正试图用相机拍一张照片并上传到Firebase。我正在使用AlertDialog询问用户是否要使用相机或从gallery中选择图像。我可以用相机拍照,但当我尝试上传图像时,它会说找不到图像

以下是我的图像选择方法:

    private void imageSelect(Context context) {
    final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("Choose Image");

    builder.setItems(options, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int item) {

            if (options[item].equals("Take Photo")) {
                Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(takePicture, 0);

            } else if (options[item].equals("Choose from Gallery")) {
                Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(pickPhoto , 1);

            } else if (options[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
        case 0:
            if(resultCode == RESULT_OK){
                filePath = data.getData();
            }

            break;
        case 1:
            if(resultCode == RESULT_OK){
                filePath = data.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            break;
    }
}
以下是我上传图片的方法:

    private void uploadImage() {
    if (filePath != null) {
        //Code for showing progressDialog while uploading
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        StorageReference ref = storageReference.child("images/" + name);
        //Adding listeners on upload or failure of image
        ref.putFile(filePath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                //Image uploaded successfully
                progressDialog.dismiss();
                Toast.makeText(add_property.this, "Image Uploaded!", Toast.LENGTH_SHORT).show();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                //Error, Image not uploaded
                progressDialog.dismiss();
                Toast.makeText(add_property.this, "Failed " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            //Progress Listener for loading
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                progressDialog.setMessage("Uploaded " + (int) progress + "%");
            }
        });
    }
    else {
        Toast.makeText(getApplicationContext(),"No image found",Toast.LENGTH_SHORT).show();
    }
}
private void uploadImage(){
if(filePath!=null){
//上载时显示progressDialog的代码
ProgressDialog ProgressDialog=新建ProgressDialog(此);
progressDialog.setTitle(“上载…”);
progressDialog.show();
StorageReference ref=StorageReference.child(“图像/”+名称);
//在图像上载或失败时添加侦听器
ref.putFile(filePath).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
//已成功上载图像
progressDialog.disclose();
Toast.makeText(添加属性this,“图像上传!”,Toast.LENGTH\u SHORT.show();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//错误,未上载图像
progressDialog.disclose();
Toast.makeText(add_property.this,“Failed”+e.getMessage(),Toast.LENGTH_SHORT.show();
}
}).addOnProgressListener(新的OnProgressListener(){
//用于加载的进度侦听器
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
双进度=(100.0*taskSnapshot.GetByTestTransferred()/taskSnapshot.getTotalByteCount());
progressDialog.setMessage(“上传”+(int)进度+“%”;
}
});
}
否则{
Toast.makeText(getApplicationContext(),“找不到图像”,Toast.LENGTH_SHORT.show();
}
}

提前感谢朋友们的帮助。

这是我的代码,我在我的应用程序中使用了它,运行得很好,如果可以,请尝试一下,然后恭喜

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_upload, container, false);
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        Button chooseImageButton = view.findViewById(R.id.upload_image_button);
        Button uploadImageButton = view.findViewById(R.id.done_button);
        uploadImageView = view.findViewById(R.id.upload_image_view);
        storageReference = FirebaseStorage.getInstance().getReference("uploads");
        databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
        chooseImageButton.setOnClickListener(v -> openFileChooser());
        uploadImageButton.setOnClickListener(v -> {
            if (mUploadTask != null && mUploadTask.isInProgress()) {
                Toast.makeText(getActivity(), "Upload in Progress", Toast.LENGTH_SHORT).show();

            } else {
                uploadToFirebase(mImageUri);
            }


        });

        return view;
    }


    private void openFileChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, PICK_IMAGE_REQUEST);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
                && data != null && data.getData() != null) {
            mImageUri = data.getData();
            Picasso.get().load(mImageUri).into(uploadImageView);

        }
    }

    private String getFileExtension(Uri uri) {

        ContentResolver contentResolver = requireActivity().getContentResolver();
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getExtensionFromMimeType(contentResolver.getType(uri));
    }

    private void uploadToFirebase(Uri mImageUri) {
        if (mImageUri != null) {
            final ProgressDialog progressDialog = new ProgressDialog(getActivity());
            progressDialog.setTitle("Uploading...");
            progressDialog.show();

            StorageReference reference = storageReference.child(System.currentTimeMillis()
                    + "." + getFileExtension(mImageUri));
            reference.putFile(mImageUri)
                    .addOnSuccessListener(taskSnapshot -> {
                        progressDialog.dismiss();
                        Toast.makeText(getActivity(), "Saved Succesfully", Toast.LENGTH_SHORT).show();
                        reference.getDownloadUrl()
                                .addOnSuccessListener(uri -> {
                                    Upload upload = new Upload(uri.toString());
                                    String uploadId = databaseReference.push().getKey();
                                    databaseReference.child(uploadId).setValue(upload);
                                });
                    })
                    .addOnProgressListener(snapshot -> {
                        double progress = (100.0 * snapshot.getBytesTransferred() / snapshot
                                .getTotalByteCount());
                        progressDialog.setMessage("Uploaded " + (int) progress + "%");
                    })
                    .addOnFailureListener(e -> {
                        progressDialog.dismiss();
                        Toast.makeText(getActivity(), "Error Ocurred" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    });


        }
    }
} 

一个潜在的解决方法是将字节数组上传到firebase中;因此,当使用相机拍摄照片时,您可以从
onActivityResult()
中接收到的意图中获取位图字节数组,并最终使用方法将字节数组上载到firebase存储器

这可以通过以下几个步骤完成:

在这里,我假设
onActivityResult()
中照相机的
requestCode
为1:

final int FROM_GALLERY = 0;
final int FROM_CAMERA = 1;

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    
    if (resultCode == RESULT_OK && data != null) {

        switch (requestCode) {
        
            case FROM_GALLERY:
            
                // Handle image from the gallery
                filePath = data.getData();
                break;


            case FROM_CAMERA:
            
                // Handle image from the camera

                if (data.getExtras() != null) {
                    Bitmap photoBitmap = (Bitmap) data.getExtras().get("data");
                    byte[] bitmapBytes = getBytesFromBitmap(bitmap, 100);
                    uploadToFirebase(bitmapBytes);
                    
                }

                break;
        }

    }
}


// convert from bitmap to byte array
public static byte[] getBytesFromBitmap(Bitmap bitmap, int quality) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);
    // bitmap.compress(Bitmap.CompressFormat.PNG, quality, stream); // According to the needed quality
    return stream.toByteArray();
}   



public void uploadToFirebase(bytes[] bytes) {
    StorageReference ref = .... 
    ref.putBytes(bytes)
        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

            }

        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
            }

        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {

            }
        }); 
}
final int FROM_GALLERY=0;
来自_摄像头的最终int=1;
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK&&data!=null){
开关(请求代码){
图库案例:
//从库中处理图像
filePath=data.getData();
打破
摄像机的外壳:
//处理来自相机的图像
if(data.getExtras()!=null){
位图photoBitmap=(位图)data.getExtras().get(“数据”);
byte[]bitmapBytes=getBytesFromBitmap(位图,100);
上载到Firebase(位图字节);
}
打破
}
}
}
//从位图到字节数组的转换
公共静态字节[]getBytesFromBitmap(位图位图,整数质量){
ByteArrayOutputStream=新建ByteArrayOutputStream();
压缩(bitmap.CompressFormat.JPEG,质量,流);
//compress(bitmap.CompressFormat.PNG,quality,stream);//根据需要的质量
返回stream.toByteArray();
}   
public void uploadToFirebase(字节[]字节){
StorageReference ref=。。。。
ref.putBytes(字节)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
}
}).addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
}
}); 
}

此代码中的哪些内容没有按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?@AlexMamo调用uploadImage方法时,会显示找不到图像。我假设这与URI设置不正确有关。这意味着
文件路径
为空,对吗?@AlexMamo是的,似乎是这样的。。。我不明白为什么filePath为null。你应该试着调试你的应用程序,看看为什么filePath的值为null。非常感谢你的代码,但不幸的是,我已经编写了类似的代码,用于从gallery中获取图像并将其应用于firebase。好的,非常抱歉,我没有看到你想要打开相机而不是gallery但我发现了一个与你类似的问题,看看答案是否对你有效