2016-11-02 154 views
0

我想在使用SiliCompressor库将图像上传到Firebase Storage之前先压缩图像,但似乎无法正常工作,ProgressDialog并未停止。我第一次做的是通过单击ImageButton将图像从图库中选取到ImageButton中。以下是我的代码。在将图像上传到Firebase存储之前压缩图像

imageSelect.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); 
       galleryIntent.setType("image/"); 
       startActivityForResult(galleryIntent, GALLERY_REQUEST); 
      } 
     }); 

--------------------------------------------------------------------- 

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == GALLERY_REQUEST && resultCode == RESULT_OK) { 


      imageUri = data.getData(); 

      // imageSelect.setImageBitmap(BitmapFactory.decodeFile(imageSelectFile.getAbsolutePath())); 
     // Compressor com = Compressor.getDefault(this).compressToFile(imageFile); 
      // imageSelect.setImageURI(imageUri); 
      Picasso.with(c).load(imageUri).fit().into(imageSelect); 

     } 
    } 

所以,现在我有方法startPosting()通过按钮的点击火力地堡存储其上载数据。 以下是我的代码。

private void startPosting() { 
     mProgress.setMessage("Uploading Image..."); 
     //Compressing an Image .... 
     String stringUri= imageUri.toString(); 
     Uri uri_image_final; 
     //String filePath = SiliCompressor.with(getApplicationContext()).compress(stringUri); 
     String filePath = SiliCompressor.with(getApplicationContext()).compress(stringUri, true); 
     uri_image_final = Uri.parse(filePath); 
     System.out.println("Whats here :" + 
       ""+ uri_image_final); 

     final String title_val = mPostTitle.getText().toString().trim(); 
     final String desc_val = mPostDesc.getText().toString().trim(); 
     if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && filePath != null) { 
      mProgress.show(); 
      StorageReference filepath = mStorage.child("BlogImages").child(uri_image_final.getLastPathSegment()); 
      filepath.putFile(uri_image_final).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 


        Uri downloadUri = taskSnapshot.getDownloadUrl(); 
        DatabaseReference newPost = mDatabase.push(); 
        DatabaseReference c = mDatabase.push(); 
        newPost.child("EventTitle").setValue(title_val); 
        newPost.child("EventDescription").setValue(desc_val); 
        newPost.child("EventImage").setValue(downloadUri.toString()); 
        newPost.child("PostId").setValue(c); 



        mProgress.dismiss(); 
        startActivity(new Intent(PostActivity.this, MainActivity.class)); 


       } 
      } 


      ); 


     } else if (TextUtils.isEmpty(title_val) && TextUtils.isEmpty(desc_val) && imageUri != null) { 
      mProgress.show(); 
      StorageReference filepath = mStorage.child("BlogImages").child(uri_image_final.getLastPathSegment()); 
      filepath.putFile(uri_image_final).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 


        Uri downloadUri = taskSnapshot.getDownloadUrl(); 
        DatabaseReference newPost = mDatabase.push(); 
        newPost.child("EventTitle").setValue(""); 
        newPost.child("EventDescription").setValue(""); 
        newPost.child("EventImage").setValue(downloadUri.toString()); 


        mProgress.dismiss(); 
        // startActivity(new Intent(PostActivity.this, MainActivity.class)); 
        Intent load= new Intent(PostActivity.this,MainActivity.class); 
        load.putExtra(eventname,eventname); 
        startActivity(load); 


       } 
      } 


      ); 

     } 

     else if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && imageUri== null){ 

      Toast.makeText(getApplicationContext(),"Please insert an Image and Upload ! ",Toast.LENGTH_LONG).show(); 

     } 
    } 

现在,如果你在该方法中看到的,我的本质是要压缩其在加载的ImageButton的图像,然后后来它上传到火力地堡。 这是Silicon Compressor的行,它尝试压缩在ImageButton中加载的图像。

String filePath = SiliCompressor.with(getApplicationContext()).compress(stringUri, true); 

我从Github的这个链接中得到了这个lib。 https://github.com/Tourenathan-G5organisation/SiliCompressor

所以我错了,请因为图像不上传,但我希望它在压缩时上传。

回答

4

这是我写的,你可以试试。

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

    if (resultCode == RESULT_OK) { 
     if (requestCode == Constants.PICK_USER_PROFILE_IMAGE) { 
      if (resultCode == RESULT_OK) { 
       Bitmap bmp = ImagePicker.getImageFromResult(this, resultCode, data);//your compressed bitmap here 
       startPosting(bmp); 
      } 
     } 
    } 
} 

你startPosting方法应该是这样的

private void startPosting(Bitmap bmp) { 
    byte[] data = bmp.toByteArray(); 
    mProgress.setMessage("Uploading Image..."); 

    final String title_val = mPostTitle.getText().toString().trim(); 
    final String desc_val = mPostDesc.getText().toString().trim(); 
    if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && filePath != null) { 
     mProgress.show(); 
     StorageReference filepath = mStorage.child("BlogImages").child(uri_image_final.getLastPathSegment()); 


     UploadTask uploadTask = filepath.putBytes(data); 
     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) { 

      Uri downloadUri = taskSnapshot.getDownloadUrl(); 
      DatabaseReference newPost = mDatabase.push(); 
      DatabaseReference c = mDatabase.push(); 
      newPost.child("EventTitle").setValue(title_val); 
      newPost.child("EventDescription").setValue(desc_val); 
      newPost.child("EventImage").setValue(downloadUri.toString()); 
      newPost.child("PostId").setValue(c); 



      mProgress.dismiss(); 
      startActivity(new Intent(PostActivity.this, MainActivity.class)); 


     } 
    }); 


    } else if (TextUtils.isEmpty(title_val) && TextUtils.isEmpty(desc_val) && imageUri != null) { 
     mProgress.show(); 
     StorageReference filepath = mStorage.child("BlogImages").child(uri_image_final.getLastPathSegment()); 
     UploadTask uploadTask = filepath.putBytes(data); 
     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) { 

       Uri downloadUri = taskSnapshot.getDownloadUrl(); 
       DatabaseReference newPost = mDatabase.push(); 
       newPost.child("EventTitle").setValue(""); 
       newPost.child("EventDescription").setValue(""); 
       newPost.child("EventImage").setValue(downloadUri.toString()); 


       mProgress.dismiss(); 
       // startActivity(new Intent(PostActivity.this, MainActivity.class)); 
       Intent load= new Intent(PostActivity.this,MainActivity.class); 
       load.putExtra(eventname,eventname); 
       startActivity(load); 


      } 
     }); 

    } 

    else if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && imageUri== null){ 

     Toast.makeText(getApplicationContext(),"Please insert an Image and Upload ! ",Toast.LENGTH_LONG).show(); 

    } 
} 

下面是有一系列的方法类ImagePicker做你的工作

public class ImagePicker { 

private static final int DEFAULT_MIN_WIDTH_QUALITY = 400;  // min pixels 
private static final String TAG = "ImagePicker"; 
private static final String TEMP_IMAGE_NAME = "tempImage"; 

public static int minWidthQuality = DEFAULT_MIN_WIDTH_QUALITY; 

public static Bitmap getImageFromResult(Context context, int resultCode, 
             Intent imageReturnedIntent) { 
    Log.d(TAG, "getImageFromResult, resultCode: " + resultCode); 
    Bitmap bm = null; 
    File imageFile = getTempFile(context); 
    if (resultCode == Activity.RESULT_OK) { 
     Uri selectedImage; 
     boolean isCamera = (imageReturnedIntent == null || 
       imageReturnedIntent.getData() == null || 
       imageReturnedIntent.getData().equals(Uri.fromFile(imageFile))); 
     if (isCamera) {  /** CAMERA **/ 
      selectedImage = Uri.fromFile(imageFile); 
     } else {   /** ALBUM **/ 
      selectedImage = imageReturnedIntent.getData(); 
     } 
     Log.d(TAG, "selectedImage: " + selectedImage); 

     bm = getImageResized(context, selectedImage); 
     int rotation = getRotation(context, selectedImage, isCamera); 
     bm = rotate(bm, rotation); 
    } 
    return bm; 
} 


private static Bitmap decodeBitmap(Context context, Uri theUri, int sampleSize) { 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = sampleSize; 

    AssetFileDescriptor fileDescriptor = null; 
    try { 
     fileDescriptor = context.getContentResolver().openAssetFileDescriptor(theUri, "r"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Bitmap actuallyUsableBitmap = BitmapFactory.decodeFileDescriptor(
      fileDescriptor.getFileDescriptor(), null, options); 

    Log.d(TAG, options.inSampleSize + " sample method bitmap ... " + 
      actuallyUsableBitmap.getWidth() + " " + actuallyUsableBitmap.getHeight()); 

    return actuallyUsableBitmap; 
} 

/** 
* Resize to avoid using too much memory loading big images (e.g.: 2560*1920) 
**/ 
private static Bitmap getImageResized(Context context, Uri selectedImage) { 
    Bitmap bm = null; 
    int[] sampleSizes = new int[]{5, 3, 2, 1}; 
    int i = 0; 
    do { 
     bm = decodeBitmap(context, selectedImage, sampleSizes[i]); 
     Log.d(TAG, "resizer: new bitmap width = " + bm.getWidth()); 
     i++; 
    } while (bm.getWidth() < minWidthQuality && i < sampleSizes.length); 
    return bm; 
} 


private static int getRotation(Context context, Uri imageUri, boolean isCamera) { 
    int rotation; 
    if (isCamera) { 
     rotation = getRotationFromCamera(context, imageUri); 
    } else { 
     rotation = getRotationFromGallery(context, imageUri); 
    } 
    Log.d(TAG, "Image rotation: " + rotation); 
    return rotation; 
} 

private static int getRotationFromCamera(Context context, Uri imageFile) { 
    int rotate = 0; 
    try { 

     context.getContentResolver().notifyChange(imageFile, null); 
     ExifInterface exif = new ExifInterface(imageFile.getPath()); 
     int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_NORMAL); 

     switch (orientation) { 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotate = 270; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotate = 180; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotate = 90; 
       break; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return rotate; 
} 

public static int getRotationFromGallery(Context context, Uri imageUri) { 
    String[] columns = {MediaStore.Images.Media.ORIENTATION}; 
    Cursor cursor = context.getContentResolver().query(imageUri, columns, null, null, null); 
    if (cursor == null) return 0; 

    cursor.moveToFirst(); 

    int orientationColumnIndex = cursor.getColumnIndex(columns[0]); 
    return cursor.getInt(orientationColumnIndex); 
} 


private static Bitmap rotate(Bitmap bm, int rotation) { 
    if (rotation != 0) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(rotation); 
     Bitmap bmOut = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); 
     return bmOut; 
    } 
    return bm; 
} 


private static File getTempFile(Context context) { 
     File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME); 
     imageFile.getParentFile().mkdirs(); 
     return imageFile; 
    } 
} 

的ImagePicker类具有的所有方法处理压缩以及图像旋转。

希望这将有助于

由于此链接的文件上传裁判

Uploading files on firebase

+0

感谢@rana,我想实现'ImagePicker'类但是'getTempFile()'丢失。 –

+0

@LutaayaHuzaifah getTempFile被添加:) –

+0

谢谢,但我仍然感到困惑,'onActivityResult()',在哪里看到你的上传图像加上压缩,你的轨道是正确的,但请你可以尝试展示我怎么能把它在我的'startPosting()'方法中,以及我必须放在'onActivityResult()'中,因为我仍然是初学者。 –

0

我已经做了这种方式:

private void startPosting() { 

     mProgress.setMessage(getString(R.string.downloading_route)); 

     final String titleVal = mRouteTitle.getText().toString().trim(); 
     final String descVal = mRouteDesc.getText().toString().trim(); 

     if (!TextUtils.isEmpty(titleVal) && !TextUtils.isEmpty(descVal) && mImageUri != null) { 

      mProgress.show(); 

      StorageReference filepath = mStorage.child("Route images").child(mImageUri.getLastPathSegment()); 

      //compress image 
      mSelectImage.setDrawingCacheEnabled(true); 
      mSelectImage.buildDrawingCache(); 
      Bitmap bitmap = mSelectImage.getDrawingCache(); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream); 
      byte[] data = byteArrayOutputStream.toByteArray(); 

      UploadTask uploadTask = filepath.putBytes(data); 

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

        @SuppressWarnings("VisibleForTests") 
        final Uri downloadUrl = taskSnapshot.getDownloadUrl(); 

        final DatabaseReference newPost = mDatabase.push(); 

        mDatabaseUser.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

          newPost.child("title").setValue(titleVal); 
          newPost.child("desc").setValue(descVal); 
          newPost.child("image").setValue(downloadUrl.toString()); 
          newPost.child("uid").setValue(mCurrentUser.getUid()); 
          newPost.child("username").setValue(dataSnapshot.child("name").getValue()).addOnCompleteListener(new OnCompleteListener<Void>() { 
           @Override 
           public void onComplete(@NonNull Task<Void> task) { 

            startActivity(new Intent(AddRouteActivity.this, MainActivity.class)); 

           } 
          }); 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 



         } 
        }); 

        mProgress.dismiss(); 

       } 
      }); 

     } 
    } 
相关问题