2016-03-25 4 views
1

Я создаю GIF Creator для моего проекта окончания. Что это такое, когда я пытаюсь выбрать из галереи фотографию, она просто отображает ее, я хочу выбрать несколько фотографий одновременно, чтобы не выбирать фотографию, чтобы получить другое изображение. Кроме того, я создал кнопку, поэтому, если пользователь изменит свое мнение, они могут удалить и начать с нуля, не перезагружая приложение, но я не знаю, для чего этот код. Основная деятельность:Как выбрать более одной фотографии из галереи?

public class MainActivity extends AppCompatActivity { 

/** 
* this is the destination of the new GIF file, it will be saved directly in the SD card 
* (internal storage) in a file named "test.gif" 
*/ 
private static final String IMAGE_PATH = "/sdcard/test.gif"; 
private static final int REQUEST_CAMERA = 0, SELECT_FILE = 1; 
private boolean zoomOut = false; 
private Button btnSelect; 
private 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); 
    ivImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      if (root.getChildCount() == 0) { 
       return; 
      } 

      FileOutputStream outStream = null; 
      try { 
       outStream = new FileOutputStream(IMAGE_PATH); 
       outStream.write(generateGIF()); 
       outStream.close(); 
       Toast.makeText(MainActivity.this, 
         "GIF saved to " + IMAGE_PATH, Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if (outStream != null) { 
        try { 
         outStream.flush(); 
         outStream.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 


       } 
      } 
     } 
    }); 
} 

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); 


// the following code causes a crash "NullPointerException" : 

//  Point point = null; // --> the reason for the crash 
//  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; // --> another crash happens here 
//  ivImage.getLayoutParams().height = 20; 


    ivImage.setLayoutParams(new ActionBar.LayoutParams(
      GridLayout.LayoutParams.WRAP_CONTENT, 
      GridLayout.LayoutParams.MATCH_PARENT)); 
    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); 

} 

private byte[] generateGIF() { 

    ArrayList<Bitmap> bitmaps = new ArrayList<>(); 

    View v; 
    ImageView iv; 
    for (int i = 0; i < root.getChildCount(); i++) { 
     v = root.getChildAt(i); 
     if (v instanceof ImageView) { 
      iv = (ImageView) v; 
      bitmaps.add(((BitmapDrawable) iv.getDrawable()).getBitmap()); 
     } 
    } 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    AnimatedGifEncoder encoder = new AnimatedGifEncoder(); 
    encoder.start(bos); 
    for (Bitmap bitmap : bitmaps) { 
     encoder.addFrame(bitmap); 
    } 
    encoder.finish(); 
    return bos.toByteArray(); 
} 

} 

ответ

0

как Кайл Shank ответил https://stackoverflow.com/a/19848052/5090511

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

Или вы можете используйте примерно следующее: https://github.com/luminousman/MultipleImagePick

+0

Мне жаль, что это только то, что я новичок в андроиде, где разместить этот код здесь, в моей основной деятельности. –

+0

Не беспокойтесь. Когда вы создаете экземпляр своего намерения, см. Эту ссылку в другом потоке stackoverflow, который я опубликовал выше. –

+0

Я проверил его, у меня есть два кода, которые я знаю, где ввести основной код намерения, но: aim.putExtra (Intent.EXTRA_ALLOW_MULTIPLE, true); –