Android tiene problemas con la compresión de imagen para reducir el tamaño

Elegí una imagen para mostrar en la pantalla, luego puedo elegir cargarla en firebase. Sin embargo, las imágenes son de 2-4 mb, y quiero hacerlas más pequeñas sin mucha pérdida de calidad. ¿Hay alguna forma de que pueda lograr eso? Quiero convertir las imágenes en 100kb o menos antes de subirlas a firebase.

He intentado con este compresorhttps: //github.com/zetbaitsu/Compresso, pero tuve problemas para que funcione.

Aquí está mi código completo:

public class AddNewItem extends AppCompatActivity {

private static final int CHOOSE_IMAGE = 177;
private ImageView imageViewAdd;
private EditText titleEditText, descriptionEditText, priceEditText, cityEditText;
private Button lanButton;
private String titleString, descriptionString, priceString, uploadID;
private Button buttonAdd, buttonRotateImage;
private ProgressBar progressBarImage;
private Uri uriSelectedImage;
private String downloadUriImage;
private FirebaseAuth mAuth;
private int imageRotation=0;
private AlertDialog.Builder mbuilder;
private StorageReference mStorageRef;
private DatabaseReference mDatabaseRef, mDatabaseRefUser;
private StorageTask mUploadTask;
int x = -10;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_new_item);

    imageViewAdd = findViewById(R.id.select_image_id);
    titleEditText = findViewById(R.id.title_edittext_id);
    descriptionEditText = findViewById(R.id.description_edittext_id);
    priceEditText = findViewById(R.id.price_edittext_id);
    lanButton = findViewById(R.id.lan_button_id);
    cityEditText = findViewById(R.id.city_textview_id);
    buttonAdd = findViewById(R.id.add_item_button_id);
    buttonRotateImage = findViewById(R.id.rotate_image_id);
    progressBarImage = findViewById(R.id.progressbar_id);
    mAuth = FirebaseAuth.getInstance();
    mbuilder = new AlertDialog.Builder(this);

    mStorageRef = FirebaseStorage.getInstance().getReference("uploads");
    mDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads");
    mDatabaseRefUser = FirebaseDatabase.getInstance().getReference("Users");
}

public void selectImage(View view) {
    Intent selectImageIntent = new Intent();
    selectImageIntent.setType("image/*");
    selectImageIntent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(selectImageIntent, "select image to show n upload"), CHOOSE_IMAGE);
}

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

    if (requestCode == CHOOSE_IMAGE && resultCode == RESULT_OK && data != null && data.getData() != null) {

        uriSelectedImage = data.getData();
        //new code
        Picasso.with(this).load(uriSelectedImage).into(imageViewAdd);
        //imageViewAdd.setScaleType(ImageView.ScaleType.FIT_XY); already in xml add_new_item

    }
}

private String getFileExtension(Uri uri) {
    ContentResolver cR = getContentResolver();
    MimeTypeMap mime = MimeTypeMap.getSingleton();
    return mime.getExtensionFromMimeType(cR.getType(uri));

}

//new code
public void uploadFile(View view) {
    // the 1st if statement is to prevent spamming of upload button while upload is in progress
    if (mUploadTask != null && mUploadTask.isInProgress()) {
        Toast.makeText(this, "is in progress", Toast.LENGTH_SHORT).show();
        return;
    }
    if (titleEditText.getText().toString().isEmpty() || titleEditText.getTextSize() < 5) {
        titleEditText.setError("Title is short, minimum 5 characters");
        titleEditText.requestFocus();
        return;
    }
    if (descriptionEditText.getText().toString().isEmpty() || descriptionEditText.getTextSize() < 20) {
        descriptionEditText.setError("Description is short, minimum 20 characters");
        descriptionEditText.requestFocus();
        return;
    }
    if(lanButton.getText().toString().isEmpty()){
        lanButton.setError("Please Choose District");
        lanButton.requestFocus();
        return;
    }
    if (cityEditText.getText().toString().isEmpty() || cityEditText.length() < 3) {
        cityEditText.setError("City/Location is short, minimum 3 characters");
        cityEditText.requestFocus();
        return;
    }
    if (priceEditText.getText().toString().isEmpty()) {
        priceEditText.setError("Price is needed");
        priceEditText.requestFocus();
        return;
    }
        else {
        if (uriSelectedImage != null) {
            StorageReference fileReference = mStorageRef.child(System.currentTimeMillis() +
                    "." + getFileExtension(uriSelectedImage));

            mUploadTask = fileReference.putFile(uriSelectedImage)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            //Delays the progressbar with 0.5 secs before it shows 0
                            //user has 0.5 secs to see the 100% bar, code is not necenssary
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    progressBarImage.setProgress(0);
                                }
                            }, 500);
                            Toast.makeText(AddNewItem.this, "Upload succesful", Toast.LENGTH_SHORT).show();
                            //Upload image is a java class.
                            uploadID = mDatabaseRef.push().getKey();
                            UploadImage uploadImage = new UploadImage(titleEditText.getText().toString(),
                                    taskSnapshot.getDownloadUrl().toString(), descriptionEditText.getText().toString(),
                                    cityEditText.getText().toString(), priceEditText.getText().toString(),
                                    imageRotation, lanButton.getText().toString(), mAuth.getCurrentUser().getUid(),
                                    uploadID, mAuth.getCurrentUser().getEmail());

                            mDatabaseRef.child(uploadID).setValue(uploadImage);

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(AddNewItem.this, e.getMessage(), Toast.LENGTH_SHORT).show();

                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            progressBarImage.setProgress((int) progress);

                        }
                    });
        } else {
            Toast.makeText(this, "no file selected", Toast.LENGTH_SHORT).show();
        }
    }

}

public void rotateImage(View view) {
    //set if condition if you want (for example if image has been set or so.... not necessary though.)
    imageViewAdd.setRotation(imageViewAdd.getRotation() + 90);
    imageRotation = (int) imageViewAdd.getRotation();
    //imageViewAdd.setScaleType(ImageView.ScaleType.FIT_XY); already in xml add_new_item
}



@Override
protected void onStart() {
    super.onStart();

    if(mAuth.getCurrentUser() == null){
        Intent mainActivityIntent = new Intent(this, MainActivity.class);
        startActivity(mainActivityIntent);
        finish();
    }
    else {
        mDatabaseRefUser.child(mAuth.getCurrentUser().getUid()).child("Online").setValue(true);


    }
}

}

Tengo<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> en el manifiesto.

¿Como puedo resolver esto

Cuando usé el compresor, cambié laACTION_GET_CONTENT aACTION_PICK, luego agregué estas líneas:

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

if (requestCode == CHOOSE_IMAGE && resultCode == RESULT_OK && data != null && data.getData() != null) {

    uriSelectedImage = data.getData();
File imageFile = new File(uriSelectedImage.getPath)
compressedImageBitmap = new Compressor(this).compressToBitmap(imageFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
compressedImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
imageByte = baos.toByteArray();
    //new code
    Picasso.with(this).load(uriSelectedImage).into(imageViewAdd);
    //imageViewAdd.setScaleType(ImageView.ScaleType.FIT_XY); already in xml add_new_item

}
} 

en elonActivityResult y declaróprivate Bitmap compressedImageBitmap ademásprivate byte[] imageByte;

Luego cambié elmUploadTask = fileReference.putFile(uriSelectedImage) aputBytes(imageByte). Sin embargo, recibo varios errores, como el puntero nulo en el mapa de imagen comprimido. Porqué es eso

¿Cómo puedo resolver este problema?

Respuestas a la pregunta(0)

Su respuesta a la pregunta