如何使用firebase存储上传到firebase文件

时间:2016-07-03 08:14:54

标签: android bitmap firebase inputstream firebase-storage

我尝试上传到firebase一张图片,当我上传它时告诉我文件的大小是0字节并且不显示内容图片

一切似乎都很好,然后发生了什么?

  StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>");

                if (inputStream!=null) {

                    String pic = "BathroomImage" + +rand.nextInt(1000) + ".jpg";
                    mountainsRef = storageRef.child(pic);
                    uploadTask = mountainsRef.putStream(inputStream);


                    uploadTask.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.d("this is the faiure:","hey im here");
                        }
                    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            taskSnapshot.getMetadata();
                            Uri downloadUri = taskSnapshot.getDownloadUrl();
                            bitmap.recycle();
                            bitmap=null;
                            System.gc();

                            try {
                                inputStream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
            }
        }

这里我将图片从数据上传到inputream。

  void TakePickphoto(){
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Create intent to Open Image applications like Gallery, Google Photos
        startActivityForResult( galleryIntent, RESULT_LOAD_IMAGE);// Start the Intent

 public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        if (requestCode == RESULT_LOAD_IMAGE && resultCode ==getActivity().RESULT_OK && null != data) {
            selectedImage = data.getData(); // Get the  URI Image from data

            handler= new Handler();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {

                        inputStream = context.getContentResolver().openInputStream(data.getData());
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inSampleSize =4;
                        bitmap = BitmapFactory.decodeStream(inputStream, new Rect(40,40,40,40),options);

                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            ImageView imageView;
                            imageView = (ImageView) view.findViewById(R.id.imageView2);
                            imageView.setImageBitmap(bitmap);


                        }
                    });
                }
            };
            new Thread(runnable).start();

        }
    }
}

请帮助,一切看起来都很好。

2 个答案:

答案 0 :(得分:0)

**这不会以完整分辨率保存图像** 要以全分辨率保存图片,请研究在启动TakePictureIntent时如何执行此操作。

我遇到了同样的错误,并通过设置我的照片和上传来解决这个问题:

    //takes the picture
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, 1);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
            //saves the pic locally
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] dataBAOS = baos.toByteArray();

            /***************** UPLOADS THE PIC TO FIREBASE*****************/
            // Points to the root reference
            StorageReference storageRef = FirebaseStorage.getInstance().getReferenceFromUrl("your-root-storage-ref");
            StorageReference imagesRef = storageRef.child("image");

            UploadTask uploadTask = imagesRef.putBytes(dataBAOS);
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                    Uri downloadUrl = taskSnapshot.getDownloadUrl();
                }
            });
        }
    }

这样,它会使用以下文件结构压缩并保存Firebase存储中的图像:

root - &gt;图像

答案 1 :(得分:0)

您可以将InputStream直接从Uri传递到putStream方法。您可能希望在上传之前自己调整图像大小,这需要更多的工作,但这种方式在客户端使用的内存非常少。

    if (requestCode == IMAGE_PICKER_SELECT && resultCode == Activity.RESULT_OK) {
        Uri imageUri = data.getData();
        try {
            ContentResolver contentResolver = getActivity().getContentResolver();
            StorageMetadata storageMetadata = new StorageMetadata.Builder()
                    .setContentType(contentResolver.getType(imageUri))
                    .build();
            FirebaseStorage.getInstance().getReference()
                    .child("users")
                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                    .child(UUID.randomUUID().toString())
                    .putStream(contentResolver.openInputStream(imageUri), storageMetadata)
                    .addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot task) {
                            Uri downloadUrl = task.getDownloadUrl();                               
                            Toast.makeText(getActivity(), R.string.image_successfully_uploaded, Toast.LENGTH_LONG).show();
                        }
                    })
                    .addOnFailureListener(getActivity(), new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getActivity(), R.string.error_uploading_image, Toast.LENGTH_LONG).show();
                        }
                    });
        } catch (IOException e) {

        }

    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }