java - 如何在上传到 firebase 时压缩图像?

标签 java android firebase firebase-storage

我正在开发一个社交应用程序,用户可以在其中将他们的图片上传到他们的供稿中,但是当用户拾取图像时,小于 2 mb 的图像被拾取并成功上传到 firebase 但是当用户上传图片超过 2mb 应用程序崩溃。可以做什么来压缩图像..

postactivity.java

 private Toolbar mToolbar;
    private ImageButton SelectPostImage;
    private Button UpdatePostButton;
    private ProgressDialog loadingBar;
    private EditText PostDescription;
    private static  final  int Gallery_pick = 1;
    private Uri ImageUri;
    private  String Description;
    private StorageReference PostsImagesReference;
    private DatabaseReference usersRef, PostsRef;
    private  FirebaseAuth mAuth;
    private  String saveCurrentDate, saveCurrentTime,current_user_id, postRandomName, downloadUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
        mAuth = FirebaseAuth.getInstance();
        current_user_id = mAuth.getCurrentUser().getUid();
        PostsImagesReference = FirebaseStorage.getInstance().getReference();
            usersRef = FirebaseDatabase.getInstance().getReference().child("Users");
            PostsRef = FirebaseDatabase.getInstance().getReference().child("Posts");
        SelectPostImage = (ImageButton)findViewById(R.id.select_post_image);
        UpdatePostButton = (Button) findViewById(R.id.update_post_button);
        PostDescription = (EditText)findViewById(R.id.post_description);
        loadingBar = new ProgressDialog(this);


        mToolbar = (Toolbar) findViewById(R.id.update_post_page_toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setTitle("Update Post");

        SelectPostImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                OpenGallery();
            }
        });

        UpdatePostButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ValidatePostInfo();

            }
        });


    }

    private void ValidatePostInfo() {
         Description = PostDescription.getText().toString();
        if (ImageUri == null){
            Toast.makeText(this, "Please select the image", Toast.LENGTH_SHORT).show();

        }
        if (TextUtils.isEmpty(Description)){
            Toast.makeText(this,"Please write something here",Toast.LENGTH_SHORT).show();

        }else {

            loadingBar.setTitle(" Add New Post");
            loadingBar.setMessage("Please wait, while we updating your new post");
            loadingBar.show();
            loadingBar.setCanceledOnTouchOutside(true);
            StoringImageToFirebaseStorage();

        }
    }

    private void StoringImageToFirebaseStorage() {
        Calendar calForDate = Calendar.getInstance();
        SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
saveCurrentDate = currentDate.format(calForDate.getTime());
        Calendar calFordTime = Calendar.getInstance();
        SimpleDateFormat currentTime = new SimpleDateFormat("HH: mm");
        saveCurrentTime = currentTime.format(calForDate.getTime());
     postRandomName = saveCurrentDate + saveCurrentTime;

        StorageReference filePath = PostsImagesReference.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg");
            filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                    if (task.isSuccessful()){
                        downloadUrl = task.getResult().getDownloadUrl().toString();
                        Toast.makeText(PostActivity.this,"Image is sucessfully uploaded to storage",Toast.LENGTH_LONG).show();
                        SavingPostInformationToDatabase();

                    }else{
                        String message = task.getException().getMessage();
                        Toast.makeText(PostActivity.this,"Error Occured:" + message,Toast.LENGTH_SHORT).show();
                    }
                }
            });

    }

    private void SavingPostInformationToDatabase() {
        usersRef.child(current_user_id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){
                    String userfullname = dataSnapshot.child("fullname").getValue().toString();
                    String userProfileImage  = dataSnapshot.child("profileimage").getValue().toString();
                    HashMap postsMap = new HashMap();
                    postsMap.put("uid",current_user_id);
                    postsMap.put("date",saveCurrentDate);

                    postsMap.put("time",saveCurrentTime);

                    postsMap.put("description",Description);

                    postsMap.put("postimage",downloadUrl);
                    postsMap.put("profileimage",userProfileImage);
                    postsMap.put("fullname",userfullname);
                    PostsRef.child(current_user_id + postRandomName).updateChildren(postsMap)
                            .addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if (task.isSuccessful()){
                                        SendUserToMainActivity();
                                        Toast.makeText(PostActivity.this,"Your New Post is Updated Sucessfully",Toast.LENGTH_SHORT).show();
                                        loadingBar.dismiss();
                                    }else{
                                        Toast.makeText(PostActivity.this,"Error Occured while updating your post .please try again ",Toast.LENGTH_LONG).show();
                                    loadingBar.dismiss();
                                    }
                                }
                            });



                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void OpenGallery() {

        Intent galleryIntent = new Intent();
        galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
        galleryIntent.setType("image/*");
        startActivityForResult(galleryIntent, Gallery_pick);
    }

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

    if (requestCode == Gallery_pick && resultCode == RESULT_OK && data != null){
       ImageUri = data.getData();
       SelectPostImage.setImageURI(ImageUri);
    }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home){
            SendUserToMainActivity();
        }

        return super.onOptionsItemSelected(item);
    }

    private void SendUserToMainActivity() {
        Intent mainintent  =  new Intent(PostActivity.this,MainActivity.class);
        startActivity(mainintent);
    }
}

最佳答案

    byte[] thumb_byte_data;
    Uri resultUri = ImageUri;

    //getting imageUri and store in file. and compress to bitmap
    File file_path = new File(resultUri.getPath());
    try {
        Bitmap thumb_bitmap = new Compressor(this)
                .setMaxHeight(200)
                .setMaxWidth(200)
                .setQuality(75)
                .compressToBitmap(file_path);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        thumb_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        thumb_byte_data = baos.toByteArray();

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

然后您可以使用以下代码上传到 firebase:

 final UploadTask uploadTask = bytepath.putBytes(thumb_byte_data);

                        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                                    @Override
                                    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                                        if (!task.isSuccessful()) {
                                            throw task.getException();
                                        }
                                        // Continue with the task to get the download URL
                                        return filepath.getDownloadUrl();

                                    }
                                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Uri> task) {
                                        if (task.isSuccessful()) {
                                            thumb_download_url = task.getResult().toString();

                                        }
                                    }
                                });

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

关于java - 如何在上传到 firebase 时压缩图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570749/

相关文章:

java - 如何在 android 中使用名称从 R. 加载

java - 过滤后如何确定ListView的ArrayAdapter是否为空

java - hibernate OneToMany 条件返回重复项

android - android 中的 UnknownHostException

java - 为什么在这里调用父类(super class)方法?

android - View 在模拟器和设备上呈现得非常慢

安卓视频流

ios - 如何在另一个函数中使用 FirebaseReference.observeSingleEvent 的变量

ios - 具有顺序和限制的 Firestore 复合查询

java - 我不断收到“java.lang.IllegalArgumentException : Given String is empty or null"and it has something to do with auth = FirebaseAuth. getInstance();”