Reputation: 1512
I have a GridView which shows all the images from phone. I'm able to select multiple images and save the selected images to arraylist. I want to restrict the size of the selected images to 1MB. For that I want to check the size of every image while selecting. If the size of clicked image is less than 1MB then it will get selected, otherwise not. Is there any way to do that?
Activity
public class CustomGalleryActivity extends AppCompatActivity implements View.OnClickListener {
private static Button selectImages;
private static GridView galleryImagesGridView;
private static ArrayList<String> galleryImageUrls;
private static GridViewAdapter imagesAdapter;
int file_size;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.customgallery_activity);
initViews();
setListeners();
fetchGalleryImages();
setUpGridView();
}
//Init all views
private void initViews() {
selectImages = (Button) findViewById(R.id.selectImagesBtn);
galleryImagesGridView = (GridView) findViewById(R.id.galleryImagesGridView);
}
//fetch all images from gallery
private void fetchGalleryImages() {
final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};//get all columns of type images
final String orderBy = MediaStore.Images.Media.DATE_TAKEN;//order data by date
Cursor imagecursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
null, orderBy + " DESC");//get all data in Cursor by sorting in DESC order
galleryImageUrls = new ArrayList<String>();//Init array
//Loop to cursor count
for (int i = 0; i < imagecursor.getCount(); i++) {
imagecursor.moveToPosition(i);
int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);//get column index
galleryImageUrls.add(imagecursor.getString(dataColumnIndex));//get Image from column index
System.out.println("Array path" + galleryImageUrls.get(i));
}
}
//Set Up GridView method
private void setUpGridView() {
imagesAdapter = new GridViewAdapter(CustomGalleryActivity.this, galleryImageUrls);
galleryImagesGridView.setAdapter(imagesAdapter);
}
//Set Listeners method
private void setListeners() {
selectImages.setOnClickListener(this);
}
//Show hide select button if images are selected or deselected
public void showSelectButton() {
ArrayList<String> selectedItems = imagesAdapter.getCheckedItems();
if (selectedItems.size() > 0) {
selectImages.setText(selectedItems.size() + " - Images Selected");
selectImages.setVisibility(View.VISIBLE);
} else
selectImages.setVisibility(View.GONE);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.selectImagesBtn:
//When button is clicked then fill array with selected images
ArrayList<String> selectedItems = imagesAdapter.getCheckedItems();
//Send back result to MainActivity with selected images
Intent intent = new Intent();
intent.putExtra(UploadActivity.CustomGalleryIntentKey, selectedItems.toString());//Convert Array into string to pass data
setResult(RESULT_OK, intent);//Set result OK
finish();//finish activity
break;
}
}
}
public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> imageUrls;
private SparseBooleanArray mSparseBooleanArray;
public GridViewAdapter(Context context, ArrayList<String> imageUrls) {
this.context = context;
this.imageUrls = imageUrls;
mSparseBooleanArray = new SparseBooleanArray();
}
//Method to return selected Images
public ArrayList<String> getCheckedItems() {
ArrayList<String> mTempArry = new ArrayList<String>();
for (int i = 0; i < imageUrls.size(); i++) {
if (mSparseBooleanArray.get(i)) {
mTempArry.add(imageUrls.get(i));
}
}
return mTempArry;
}
@Override
public int getCount() {
return imageUrls.size();
//return 10;
}
@Override
public Object getItem(int i) {
return imageUrls.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null)
view = inflater.inflate(R.layout.customgridview_item, viewGroup, false);//Inflate layout
CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.selectCheckBox);
final ImageView imageView = (ImageView) view.findViewById(R.id.galleryImageView);
Picasso.with(context).load("file://" + imageUrls.get(position)).placeholder(R.drawable.placeholder).into(imageView);
mCheckBox.setTag(position);//Set Tag for CheckBox
mCheckBox.setChecked(mSparseBooleanArray.get(position));
mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
return view;
}
CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
System.out.println("sammy_position "+buttonView.getTag());
File f = new File(imageUrls.get((Integer) buttonView.getTag()));
int file_size = Integer.parseInt(String.valueOf(f.length() / (1024*1024)));
// Filtering the image size
if(file_size<1){
mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);//Insert selected checkbox value inside boolean array
((CustomGalleryActivity) context).showSelectButton();//call custom gallery activity method
}else{
buttonView.setChecked(false);
Toast.makeText(context, "Select image of size 1MB or less", Toast.LENGTH_SHORT).show();
}
}
};
}
Upvotes: 0
Views: 69
Reputation: 729
public void calculateImageSize(int imageId){
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
imageId);
Bitmap bitmap = bitmapOrg;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageInByte = stream.toByteArray();
long lengthbmp = imageInByte.length;
double sizeInKB=(lengthbmp/1024);
double sizeInMB=(lengthbmp/(1024*1024));
Log.d("TAG","Size "+sizeInKB+"KB");
Log.d("TAG","Size "+sizeInMB+"MB");
}
Replace Adapter With this
import android.content.Context;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import java.util.ArrayList;
public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> imageUrls;
private SparseBooleanArray mSparseBooleanArray;
private boolean isCustomGalleryActivity;
public GridViewAdapter(Context context, ArrayList<String> imageUrls, boolean isCustomGalleryActivity) {
this.context = context;
this.imageUrls = imageUrls;
this.isCustomGalleryActivity = isCustomGalleryActivity;
mSparseBooleanArray = new SparseBooleanArray();
}
//Method to return selected Images
public ArrayList<String> getCheckedItems() {
ArrayList<String> mTempArry = new ArrayList<String>();
for (int i = 0; i < imageUrls.size(); i++) {
if (mSparseBooleanArray.get(i)) {
mTempArry.add(imageUrls.get(i));
}
}
return mTempArry;
}
@Override
public int getCount() {
return imageUrls.size();
//return 10;
}
@Override
public Object getItem(int i) {
return imageUrls.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null)
view = inflater.inflate(R.layout.customgridview_item, viewGroup, false);//Inflate layout
CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.selectCheckBox);
final ImageView imageView = (ImageView) view.findViewById(R.id.galleryImageView);
//If Context is MainActivity then hide checkbox
if (!isCustomGalleryActivity)
mCheckBox.setVisibility(View.GONE);
Picasso.with(context).load("file://" + imageUrls.get(position)).placeholder(R.drawable.placeholder).into(imageView);
mCheckBox.setTag("file://" + imageUrls.get(position));
mCheckBox.setId(position);//Set Tag for CheckBox
mCheckBox.setChecked(mSparseBooleanArray.get(position));
mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
return view;
}
CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mSparseBooleanArray.put((Integer) buttonView.getId(), isChecked);//Insert selected checkbox value inside boolean array
String imagePath = (String) buttonView.getTag();
((CustomGalleryActivity) context).showSelectButton();//call custom gallery activity method
}
};
}
Use this function to find out the size in kb & MB
Upvotes: 1