2013-05-06 22 views
16

Ho un selettore di intenti che mi permette di scegliere un'immagine dalla galleria o fotocamera in questo modo:Immagine proveniente dalla fotocamera o dalla galleria?

Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null); 
    galleryIntent.setType("image/*"); 
    galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); 

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 


    Intent chooser = new Intent(Intent.ACTION_CHOOSER); 
    chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);  
    chooser.putExtra(Intent.EXTRA_TITLE, "title"); 

    Intent[] intentArray = {cameraIntent}; 
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 
    startActivityForResult(chooser,REQUEST_CODE); 

voglio che il mio metodo onActivityResult per essere come questo:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(Condition == picture_coming_from_gallery) 
    { 
    //my code here 
    } 
    else if(condition == picture_coming_from_camera) 
    { 
    //another code here 
    } 
} 

Qual è la condizione che permette per sapere da quale fonte proviene la mia immagine?

Aggiornato:

Ora sta funzionando ed ecco la soluzione:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) 
    { 
     if(data.getData()!=null) 
     { 
      try 
      { 
      if (bitmap != null) 
       { 
        bitmap.recycle(); 
       } 

      InputStream stream = getContentResolver().openInputStream(data.getData()); 
      bitmap = BitmapFactory.decodeStream(stream); 
      stream.close(); 
      imageView.setImageBitmap(bitmap); 
      } 

     catch (FileNotFoundException e) 
      { 
       e.printStackTrace(); 
      } 

     catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     else 
     { 
      bitmap=(Bitmap) data.getExtras().get("data"); 
      imageView.setImageBitmap(bitmap); 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Grazie per voi aiuto!

+0

Suggerirei di utilizzare un GridView per popolare le azioni e assegnare un OnItemClickListener per catturare l'elemento su cui si fa clic. –

+1

@ChorWaiChun - sta aprendo un 'attività' esterna tramite un' Intento' in modo da non avere alcun controllo sulla visualizzazione delle immagini. – ianhanniballake

+0

@ianhanniballake Ecco perché dovrebbe popolare manualmente il selettore, tramite GridView, mostrato usando Dialog, invece di "aprire un Avtivity esterno" –

risposta

12

Sebbene l'attuale parte di codice sia un modo preciso di presentare le opzioni tra cui scegliere, ho scoperto che era molto difficile da gestire. Almeno nel mio caso d'uso lo era. Ho bisogno di memorizzare le immagini riprese dalla fotocamera per elaborare ulteriormente nell'Avenger SDK (se l'utente sceglie).

A tal fine, vorrei proporre una soluzione alternativa.

Questo non risolve la tua domanda di per sé. Ma offre un'alternativa considerando che è necessario sapere da dove proviene l'Immagine (Fotocamera/Galleria).

AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this); 
builder.setTitle("Choose Image Source"); 
builder.setItems(new CharSequence[] {"Gallery", "Camera"}, 
     new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     switch (which) { 
     case 0: 

      // GET IMAGE FROM THE GALLERY 
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType("image/*"); 

      Intent chooser = Intent.createChooser(intent, "Choose a Picture"); 
      startActivityForResult(chooser, ACTION_REQUEST_GALLERY); 

      break; 

     case 1: 
      Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE"); 

      File cameraFolder; 

      if (android.os.Environment.getExternalStorageState().equals 
        (android.os.Environment.MEDIA_MOUNTED)) 
       cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(), 
         "some_directory_to_save_images/"); 
      else 
       cameraFolder= StatusUpdate.this.getCacheDir(); 
      if(!cameraFolder.exists()) 
       cameraFolder.mkdirs(); 

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); 
      String timeStamp = dateFormat.format(new Date()); 
      String imageFileName = "picture_" + timeStamp + ".jpg"; 

      File photo = new File(Environment.getExternalStorageDirectory(), 
        "some_directory_to_save_images/" + imageFileName); 
      getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 
      initialURI = Uri.fromFile(photo); 

      startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA); 

      break; 

     default: 
      break; 
     } 
    } 
}); 

builder.show(); 

Questo è il risultato (Continuo a sostenere che il codice dà una migliore gruppo di selezione, ma ancora una volta, non è la cosa più semplice nel vostro caso d'uso o in miniera sia):

enter image description here

Ora è in grado di elaborare il risultato in base alla fonte della selezione:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 

     switch (requestCode) { 
     case ACTION_REQUEST_GALLERY: 

      break; 

     case ACTION_REQUEST_CAMERA: 

      break;   
     } 

    } 
}; 

AGGIORNATO:

Trovato! C'è uno answer here on SO che risponde esattamente a ciò che ti serve. È ancora una soluzione * di sorta *. Nel senso che non si basa su diversi requestCodes. Ma funziona comunque.

Strano mi è mancato quando ero bloccato con questo. :-(

NOTA:..io non metto il codice qui e stanno collegando ad esso invece Tutte puntelli vanno all'autore originale :-)

+0

sì, è un grande ringraziamento, il tuo codice è un altro modo per farlo, 'data.getData()' quando è nullo il tuo è nella custodia della fotocamera, quando è diverso è il caso della galleria. –

+0

@HossamOukli: Yup. E vorrei averlo trovato anche prima. ;-) –

3

È possibile distinguere utilizzando REQUEST_CODE

private static final int PICK_FROM_CAMERA = 1; 
     private static final int PICK_FROM_GALLARY = 2; 

     /* For Image capture from camera */ 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, PICK_FROM_CAMERA); 

    /* For Image capture from Gallary*/    
     startActivityForResult(new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 
             PICK_FROM_GALLARY); 
         } 



public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 

     switch (requestCode) { 
       case PICK_FROM_CAMERA: 
      if (resultCode == Activity.RESULT_OK) { 
      Bitmap bitmapImage = (Bitmap) intent.getExtras().get("data"); 
       } 
       break; 

       case PICK_FROM_GALLARY: 
       if (resultCode == Activity.RESULT_OK) { 
       Uri mImageCaptureUri = intent.getData(); 
       } 
      break; 
     } 
} 
+1

Grazie per il tuo aiuto che è fantastico, tranne una cosa, non c'è un selezionatore deciso qui, che ho bisogno di male. –

Problemi correlati