Click here to Skip to main content
15,867,453 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
I have an android app that gets pictures from the gallery and from the camera. I have the code as well to convert those multiple pictures that I choose to one GIF file but I don't know where exactly to include in my code or how and if there's anything that I need to include in my xml file. Kindly help me out with this as I'm new to android programming and it's a school project.

The code of the app:
Java
public class MainActivity extends AppCompatActivity {
 private boolean zoomOut = false;
 int REQUEST_CAMERA = 0, SELECT_FILE = 1;
 Button btnSelect;

 LinearLayout root ;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.content_main);
     btnSelect = (Button) findViewById(R.id.btnSelectPhoto);
     root = (LinearLayout) findViewById(R.id.ll);


     btnSelect.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View v) {
             selectImage();
         }
     });

     ImageView ivImage = (ImageView) findViewById(R.id.ivImage);
 }

 private void selectImage() {
     final CharSequence[] items = { "Take Photo", "Choose from Library",
             "Cancel" };

     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
     builder.setTitle("Add Photo!");
     builder.setItems(items, new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog, int item) {
             if (items[item].equals("Take Photo")) {
                 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                 startActivityForResult(intent, REQUEST_CAMERA);
             } else if (items[item].equals("Choose from Library")) {
                 Intent intent = new Intent(
                         Intent.ACTION_PICK,
                         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                 intent.setType("image/* video/*");
                 startActivityForResult(
                         Intent.createChooser(intent, "Select File"),
                         SELECT_FILE);
             } else if (items[item].equals("Cancel")) {
                 dialog.dismiss();
             }
         }
     });
     builder.show();
 }

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

     if (resultCode == Activity.RESULT_OK) {
         if (requestCode == SELECT_FILE)
             onSelectFromGalleryResult(data);
         else if (requestCode == REQUEST_CAMERA)
             onCaptureImageResult(data);
     }
 }

 private void onCaptureImageResult(Intent data) {
     Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
     ByteArrayOutputStream bytes = new ByteArrayOutputStream();
     thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
     Bitmap resized = Bitmap.createScaledBitmap(thumbnail, 800, 150, true);
     File destination = new File(Environment.getExternalStorageDirectory(),
             System.currentTimeMillis() + ".jpg");

     FileOutputStream fo;
     try {
         destination.createNewFile();
         fo = new FileOutputStream(destination);
         fo.write(bytes.toByteArray());
         fo.close();
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
     ImageView ivImage = new ImageView(this);
     GradientDrawable gd = new GradientDrawable();
     gd.setColor(0xFF00FF00); // Changes this drawbale to use a single color instead of a gradient
     gd.setCornerRadius(5);
     gd.setStroke(1, 0xFF000000);

     ivImage.setBackground(gd);
     Point point = null;
     getWindowManager().getDefaultDisplay().getSize(point);
     int width = point.x;
     int height = point.y;

     ivImage.setMinimumWidth(width);
     ivImage.setMinimumHeight(height);

     ivImage.setMaxWidth(width);
     ivImage.setMaxHeight(height);
     ivImage.getLayoutParams().width = 20;
     ivImage.getLayoutParams().height = 20;
     ivImage.setLayoutParams(new ActionBar.LayoutParams(
             GridLayout.LayoutParams.MATCH_PARENT,
             GridLayout.LayoutParams.WRAP_CONTENT));
     ivImage.setImageBitmap(thumbnail);
     root.addView(ivImage);

 setContentView(root);
 ivImage.setImageBitmap(thumbnail);
 }

 @SuppressWarnings("deprecation")
 private void onSelectFromGalleryResult(Intent data) {
     Uri selectedImageUri = data.getData();
     String[] projection = { MediaStore.MediaColumns.DATA };
     Cursor cursor = managedQuery(selectedImageUri, projection, null, null,
             null);
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
     cursor.moveToFirst();

     String selectedImagePath = cursor.getString(column_index);

     Bitmap bm;
     BitmapFactory.Options options = new BitmapFactory.Options();
     options.inJustDecodeBounds = true;
     BitmapFactory.decodeFile(selectedImagePath, options);
     final int REQUIRED_SIZE = 200;
     int scale = 1;
     while (options.outWidth / scale / 2 >= REQUIRED_SIZE
             && options.outHeight / scale / 2 >= REQUIRED_SIZE)
         scale *= 2;
     options.inSampleSize = scale;
     options.inJustDecodeBounds = false;
     bm = BitmapFactory.decodeFile(selectedImagePath, options);
     final ImageView ivImage = new ImageView(this);
     ivImage .setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if(zoomOut) {
                 Toast.makeText(getApplicationContext(), "NORMAL SIZE!", Toast.LENGTH_LONG).show();
                 ivImage.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
                 ivImage.setAdjustViewBounds(true);
                 zoomOut =false;
             }else{
                 Toast.makeText(getApplicationContext(), "FULLSCREEN!", Toast.LENGTH_LONG).show();
                 ivImage.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
                 ivImage.setScaleType(ImageView.ScaleType.FIT_XY);
                 zoomOut = true;
             }
         }
     });
     Display display = getWindowManager().getDefaultDisplay();
     int width = display.getWidth();
     int height = display.getHeight();

     ivImage.setMinimumWidth(width);
     ivImage.setMinimumHeight(height);

     ivImage.setMaxWidth(width);
     ivImage.setMaxHeight(height);
     ivImage.setLayoutParams(new ActionBar.LayoutParams(
             1000,
             1000));
     ivImage.setImageBitmap(bm);
     root.addView(ivImage);
     setContentView(root);
     ivImage.setImageBitmap(bm);

 }

  }


And the code of converting the pictures to GIF:

Java
public byte[] generateGIF() {
    ArrayList<Bitmap> bitmaps = adapter.getBitmapArray();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    AnimatedGifEncoder encoder = new AnimatedGifEncoder();
    encoder.start(bos);
    for (Bitmap bitmap : bitmaps) {
        encoder.addFrame(bitmap);
    }
    encoder.finish();
    return bos.toByteArray();
    }

As well as for the output:

Java
FileOutputStream outStream = null;
        try{
            outStream = new FileOutputStream("/sdcard/generate_gif/test.gif");
            outStream.write(generateGIF());
            outStream.close();
        }catch(Exception e){
            e.printStackTrace();
        }



You can refer to the answer here in that link: http://stackoverflow.com/questions/16331437/how-to-create-an-animated-gif-from-jpegs-in-android-development?lq=1
I don't get the answer to be honest.

What I have tried:

I didn't try anything yet I don't know how to do it
Posted
Comments
Richard MacCutchan 16-Feb-16 11:21am    
Would it not make more sense to ask the person at Stackoverflow who wrote the code?
Member 12331330 16-Feb-16 11:23am    
I can't comment there unfortunately

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900