2010-04-25 16 views
64

Sto sviluppando un'app per Android 2.1 verso l'alto. Voglio consentire ai miei utenti di selezionare un'immagine del profilo all'interno della mia app (non sto utilizzando la struttura dei contatti).Singolo intento di consentire all'utente di scattare foto O di prelevare un'immagine dalla galleria in Android

La soluzione ideale sarebbe quella di sparare un intento che consente all'utente di selezionare un'immagine dalla galleria, ma se un'immagine appropriata non è disponibile quindi utilizzare la fotocamera per scattare una foto (o viceversa cioè consentire all'utente di fai una foto, ma se sanno che hanno già un'immagine adatta, lascia che cadano nella galleria e prendi la suddetta immagine).

Attualmente posso fare l'uno o l'altro ma non entrambi.

Se si passa direttamente alla modalità videocamera utilizzando MediaStore.ACTION_IMAGE_CAPTURE, non è possibile cadere nella galleria.

Se vado direttamente alla galleria utilizzando Intent.ACTION_PICK, posso selezionare un'immagine, ma se faccio clic sul pulsante della fotocamera (nell'angolo in alto a destra della galleria) viene emessa una nuova videocamera. Quindi, qualsiasi immagine che viene scattata non viene restituita direttamente alla mia applicazione. (Certo, puoi premere il pulsante Indietro per tornare nella galleria e selezionare l'immagine da lì, ma questo è un passaggio extra non necessario e non è affatto intuitivo).

Quindi c'è un modo per combinare entrambi o sto andando a dover offrire un menu per fare uno o l'altro all'interno della mia applicazione? Sembra che sarebbe un caso di uso comune ... sicuramente mi manca qualcosa?

+0

prega di consultare questo answer: http://stackoverflow.com/questions/4455558/allow-user-to-select-camera-or-gallery-for-image/43679238#43679238 –

+0

https://stackoverflow.com/questions/27874038/how- to-make-intent-chooser-per-camera-o-gallery-application-in-android-like-wha –

risposta

13

UPDATE: L'altra risposta, utilizzando EXTRA_INITIAL_INTENTS, è migliore a questo punto. Al momento ho scritto la mia risposta, EXTRA_INITIAL_INTENTS non esistevano ancora, come è stato aggiunto a livello di API 5.

Così, c'è un modo per combinare entrambi o sono io andando a offrire un menu per fai l'una o l'altra dall'interno della mia applicazione ?

Scrivi la tua galleria che ha le caratteristiche che desideri.

Penso che un menu sarebbe più semplice.

Sembra che sia un caso comune ... sicuramente mi manca qualcosa?

Lo sviluppatore accanto a voi penserà che la galleria dovrebbe consentire di scegliere dalla galleria locale oppure di saltare su Flickr per effettuare una selezione da lì. Un altro sviluppatore penserà che la fotocamera non dovrebbe solo consentire di "scattare una foto" tramite la fotocamera, ma di "scattare una foto" scegliendo qualcosa dalla galleria, invertendo le cose dal modo in cui la immaginate. Ancora un altro sviluppatore penserà che la galleria dovrebbe consentire il prelievo dalla galleria locale, o Flickr, o la fotocamera, o una webcam collegata alla rete. Ancora un altro sviluppatore penserà che la galleria sia stupida e gli utenti dovrebbero semplicemente scegliere i file tramite un file explorer. E così via.

Tutto questo in un ambiente (telefoni cellulari) in cui il flash per il sistema operativo è un premio.

Quindi, IMHO, non è del tutto sconvolgente che il core team di Android abbia scelto di fornire elementi costitutivi da assemblare come meglio credi, piuttosto che tentare di adattarsi a ogni possibile schema.

+0

OK, grazie Marco. Come avido lettore dei tuoi libri di comunione, lo prenderò come risposta definitiva. Per ora implementerò un menu nella mia app e terrò le mie dita incrociate che G produce qualcosa per me come parte della prevista uscita di Froyo il mese prossimo. L'app Gallery è così bella su 2.1, mi piacerebbe poterla riutilizzare/personalizzare per questo scenario. – Damian

+0

Sì, la tua nozione ("ACTION_PICK" seguita dall'icona della fotocamera farebbe una foto, aggiungila e restituire l'immagine) certamente non è pazzesco. Potresti voler prendere un po 'il codice pre-Froyo per la Gallery e vedere cosa stanno facendo lì. – CommonsWare

+4

Generalmente, nel caso in cui si desideri dire "voglio che l'utente selezioni per me il tipo di contenuto X di qualche tipo", si utilizzerà GET_CONTENT. Ad esempio qui useresti GET_CONTENT con type image/*, che prima presenterebbe all'utente un elenco di cose da cui è possibile selezionare le immagini (galleria, fotocamera e qualsiasi altra applicazione abbia immagini da offrire). – hackbod

114

Si può provare a fare qualcosa di simile:

// ... 
// Within your enclosing Class 
// ... 
private static final int SELECT_PICTURE = 1; 

// ... 

Intent pickIntent = new Intent(); 
pickIntent.setType("image/*"); 
pickIntent.setAction(Intent.ACTION_GET_CONTENT); 

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

String pickTitle = "Select or take a new Picture"; // Or get from strings.xml 
Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); 
chooserIntent.putExtra 
(
    Intent.EXTRA_INITIAL_INTENTS, 
    new Intent[] { takePhotoIntent } 
); 

startActivityForResult(chooserIntent, SELECT_PICTURE); 

Per vedere come gestire il risultato del activitiy, si prega di fare riferimento a this question


Nota: un punto critico è come determinare se il è stata utilizzata la fotocamera o la galleria. Ciò è dimostrato in questo esempio di codice: https://stackoverflow.com/a/12347567/294884

+2

Questa è un'ottima risposta ... e una soluzione molto carina. .. – TacB0sS

+0

Penso che questa dovrebbe essere la risposta più utile! L'ho provato io stesso e funziona perfettamente. – prageeth

+1

Sfortunatamente, questo non funziona se "EXTRA_INITIAL_INTENTS' risolve più di una attività, perché non sono unite nel selettore originale. Invece, nel selettore viene visualizzata una voce di sistema che, quando selezionata, apre un altro selettore in cui l'utente può selezionare l'applicazione per gestire gli 'EXTRA_INITIAL_INTENTS'. Poiché non sei in grado di controllare quante applicazioni sono installate per eseguire una determinata attività, questa soluzione è solo un pio desiderio, imperfetto per tutti gli usi pratici. –

10

Si può procedere in questo modo nella vostra attività:

private static final int REQUEST_CODE_PICTURE= 1; 

    /** 
    * Click on View to change photo. Sets into View of your layout, android:onClick="clickOnPhoto" 
    * @param view View 
    */ 
    public void clickOnPhoto(View view) { 
     Intent pickIntent = new Intent(); 
     pickIntent.setType("image/*"); 
     pickIntent.setAction(Intent.ACTION_GET_CONTENT); 
     Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     String pickTitle = "Take or select a photo"; 
     Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent }); 
     startActivityForResult(chooserIntent, REQUEST_CODE_PICTURE); 
    } 

Quindi, aggiungere sempre in attività il metodo onActivityResult:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { 
      if (data == null) { 
       return; 
      } 
      try { 
       InputStream inputStream = getContentResolver().openInputStream(data.getData()); 
       Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
       imgPhoto.setImageBitmap(bitmap); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+5

In '' onActivityResult'', funziona solo con '' pickIntent'', ma non funziona con '' takePhotoIntent'' – sky91

+0

Usando questo, come posso visualizzare la foto in modalità verticale? Se faccio una foto in modalità verticale, viene visualizzata in modalità orizzontale. – LizG

+0

Usa Glide o Picasso per visualizzare l'immagine nel modo corretto –

Problemi correlati