2013-07-20 21 views
44

Sto cercando di consentire all'utente di scegliere qualsiasi immagine che desidera sul proprio dispositivo da utilizzare come sfondo in questa applicazione per sfondi che sto costruendo. Per qualche ragione, quando scrivo:Differenza tra Intent.ACTION_GET_CONTENT e Intent.ACTION_PICK

Intent myIntent = new Intent(Intent.ACTION_PICK); 
myIntent.setType("image/*"); 
startActivityForResult(myIntent, 100); 

vado dritto nella galleria, ma quando scrivo:

Intent myIntent = new Intent(Intent.ACTION_GET_CONTENT, null); 
myIntent.setType("image/*"); 
startActivityForResult(myIntent, 100); 

ricevo da scegliere Galleria, o Google Drive. Qual è il modo migliore per consentire all'utente di scegliere quale app recuperare l'immagine ogni volta? O perché quelle due costanti di intenti differenti fanno la differenza?

risposta

78

Il tuo primo Intent non è valido. Lo protocol for ACTION_PICK richiede di fornire un Uri che indica la raccolta da cui si sta prelevando.

Qual è il modo migliore per consentire all'utente di scegliere quale applicazione recuperare l'immagine ogni volta?

Se si desidera che l'utente scelga qualcosa in base al tipo MIME, utilizzare ACTION_GET_CONTENT.

Se si dispone di una raccolta specifica (identificata da un Uri) da cui si desidera che l'utente scelga, utilizzare ACTION_PICK.

In caso di parità, andare con ACTION_GET_CONTENT. Mentre ACTION_PICK non è formalmente deprecato, Dianne Hackborn recommends ACTION_GET_CONTENT.

+1

Interessante che il primo tentativo funzioni, anche se non è valido. Apprezzo comunque i suggerimenti. Grazie – EGHDK

+0

Per curiosità, perché Dianne fa sembrare che "ACTION_GET_CONTENT" sia stato aggiunto in seguito all'API, definendolo "moderno". Erano entrambi disponibili in API 1, quindi questo mi fa sentire come se gli ingegneri di Android si inventassero, se davvero non volevano che le persone usassero "ACTION_PICK". È stato troppo tardi per rimuoverlo con l'API 1? –

+1

@ Thurbo: Dovresti chiederlo a lei, mi dispiace. – CommonsWare

12

Il moderna azione è ACTION_GET_CONTENT, che è molto meglio supportata,

ACTION_PICK:

attività azione: Scegli una voce dai dati, restituendo ciò che è stato selezionato.

Ingresso: getData() è un URI contenente una directory di dati (vnd.android.cursor.dir/*) da cui selezionare un elemento.

uscita: L'URI del elemento che è stato scelto.

Costante Valore: "android.intent.action.PICK"


Differenza: -

Azione attività: consentire all'utente di selezionare un particolare tipo di dati e restituirlo.

Questo è diverso da ACTION_PICK in quanto qui diciamo solo che tipo di dati si desidera, non un URI di dati esistenti da cui l'utente può selezionare.

A ACTION_GET_CONTENT potrebbe consentire all'utente di creare i dati durante l'esecuzione (ad esempio scattare una foto o registrare un suono), far loro browse attraverso il web e scaricare i dati desiderati, ecc

Riferimentohttp://developer.android.com/reference/android/content/Intent.html#ACTION_GET_CONTENT

+0

ACTION_GET_CONTENT mi darà errori sui dispositivi più vecchi? – EGHDK

+2

"ACTION_PICK è deprecato" - tecnicamente, non lo è. – CommonsWare

+0

Non sono riuscito a distinguere tra ACTION_PICK e ACTION_GET_CONTENT finché non ho letto il tuo esempio: scattare una foto o registrare un suono. Grazie. – jclova

0
public static final String ACTION_GET_CONTENT 

Aggiunto in livello API 1

Azione attività: consentire all'utente di selezionare un particolare tipo di dati e restituirlo. Questo è diverso da ACTION_PICK in quanto qui diciamo solo che tipo di dati si desidera, non un URI di dati esistenti da cui l'utente può scegliere.Un ACTION_GET_CONTENT potrebbe consentire all'utente di creare i dati durante l'esecuzione (ad esempio scattare una foto o la registrazione di un suono), lasciarli navigare attraverso il web e scarica i dati desiderati, ecc

via http://developer.android.com/reference/android/content/Intent.html#ACTION_GET_CONTENT