Сжатие изображения с помощью AsyncTask перед загрузкой в ​​Firebase Storage - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь сжать изображения перед их загрузкой в ​​Firebase Storage, используя этот класс, расширяющий AsyncTask

public class BackgroundImageResize extends AsyncTask<Uri, Integer, byte[]> {

    Bitmap mBitmap;

    public BackgroundImageResize(Bitmap bitmap) {
        if(bitmap != null){
            this.mBitmap = bitmap;
        }
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Toast.makeText(NextActivity.this, "compressing image", Toast.LENGTH_SHORT).show();
       // showProgressBar();
    }

    @Override
    protected byte[] doInBackground(Uri... params) {
        Log.d(TAG, "doInBackground: started.");

        if(mBitmap == null){
            try{
                mBitmap = MediaStore.Images.Media.getBitmap(NextActivity.this.getContentResolver(), params[0]);
            }catch (IOException e){
                Log.e(TAG, "doInBackground: IOException: " + e.getMessage());
            }
        }
        byte[] bytes = null;
        bytes = getBytesFromBitmap(mBitmap, 100);
        return bytes;
    }

    @Override
    protected void onPostExecute(byte[] bytes) {
        super.onPostExecute(bytes);
        mUploadBytes = bytes;
     //   hideProgressBar();
        //execute the upload task

    }
}

public static byte[] getBytesFromBitmap(Bitmap bitmap, int quality){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality,stream);
    return stream.toByteArray();
}

, используя этот onClickView, чтобы вызывать его

public void onClick(View v) {
            Log.d(TAG, "onClick: navigating to the final share screen.");

            //Compress the image

           try{ backgroundImageResize.execute() ; } catch (NullPointerException e) {}


            //upload the image to firebase
            Toast.makeText(NextActivity.this, "Attempting to upload new photo", Toast.LENGTH_SHORT).show();
            String caption = mCaption.getText().toString();

            if(intent.hasExtra(getString(R.string.selected_image))){
                imgUrl = intent.getStringExtra(getString(R.string.selected_image));
                mFirebaseMethods.uploadNewPhoto(getString(R.string.new_photo), caption, imageCount, imgUrl,null);
            }
            else if(intent.hasExtra(getString(R.string.selected_bitmap))){
                bitmap = (Bitmap) intent.getParcelableExtra(getString(R.string.selected_bitmap));
                mFirebaseMethods.uploadNewPhoto(getString(R.string.new_photo), caption, imageCount, null,bitmap);
            }

MyВопрос в том, как передать растровое изображение или URL-адрес в этот BackgroundImageResize в onCLickListener?

это метод загрузки хранилища в Firebase

 public void uploadNewPhoto(String photoType, final String caption,final int count, final String imgUrl,
                           Bitmap bm){
    Log.d(TAG, "uploadNewPhoto: attempting to uplaod new photo.");

    FilePaths filePaths = new FilePaths();
    //case1) new photo
    if(photoType.equals(mContext.getString(R.string.new_photo))){
        Log.d(TAG, "uploadNewPhoto: uploading NEW photo.");

        String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
        StorageReference storageReference = mStorageReference
                .child(filePaths.FIREBASE_IMAGE_STORAGE + "/" + user_id + "/photo" + (count + 1));

        //convert image url to bitmap
        if(bm == null){
            bm = ImageManager.getBitmap(imgUrl);
        }

        byte[] bytes = ImageManager.getBytesFromBitmap(bm, 90);


        UploadTask uploadTask = null;
        uploadTask = storageReference.putBytes(bytes);

        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Uri firebaseUrl = taskSnapshot.getDownloadUrl();

                Toast.makeText(mContext, "photo upload success", Toast.LENGTH_SHORT).show();

                //add the new photo to 'photos' node and 'user_photos' node
                addPhotoToDatabase(caption, firebaseUrl.toString());

                //navigate to the main feed so the user can see their photo
                Intent intent = new Intent(mContext, HomeActivity.class);
                mContext.startActivity(intent);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "onFailure: Photo upload failed.");
                Toast.makeText(mContext, "Photo upload failed ", Toast.LENGTH_SHORT).show();
            }
        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();

                if(progress - 15 > mPhotoUploadProgress){
                    Toast.makeText(mContext, "photo upload progress: " + String.format("%.0f", progress) + "%", Toast.LENGTH_SHORT).show();
                    mPhotoUploadProgress = progress;
                }

                Log.d(TAG, "onProgress: upload progress: " + progress + "% done");
            }
        });

1 Ответ

0 голосов
/ 26 апреля 2018

В соответствии с вашим классом BackgroundImageResize вы можете передать само растровое изображение в конструктор.Я не могу найти место, где вы создаете свой экземпляр BackgroundImageResize, но вы должны сделать это следующим образом:

BackgroundImageResize backgroundImageResize = new BackgroundImageResize(bitmap);

Вы также можете передать Uri методу execute() в onClick() следующим образом:

public void onClick(View v) {
    ...
    try{ backgroundImageResize.execute(yourUri); } catch (NullPointerException e) {}
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...