66 votes

Intention unique de laisser l’utilisateur prendre une photo OU choisir une image de la galerie dans Android

Je suis le développement d'une application pour Android 2.1 vers le haut. Je veux permettre à mes utilisateurs de sélectionner une photo de profil au sein de mon application (je ne suis pas en utilisant les contacts de cadre).

La solution idéale serait de tirer une intention qui permet à l'utilisateur de sélectionner une image dans la galerie, mais si une image n'est pas disponible, utilisez l'appareil photo pour prendre une photo (ou vice-versa, c'est à dire permettre à l'utilisateur de prendre une photo, mais si ils savent qu'ils ont déjà une image déjà, les laisser tomber dans la galerie et pick a déclaré à l'image).

Actuellement je peux faire l'un ou l'autre mais pas les deux.

Si je vais directement en mode de l'appareil photo à l'aide de MediaStore.ACTION_IMAGE_CAPTURE alors il n'existe aucune option de tomber dans la galerie.

Si je vais directement à la galerie à l'aide de l'Intention.ACTION_PICK alors je peux prendre une image, mais si je clique sur le bouton de la caméra (dans le coin en haut à droite de la galerie), une nouvelle caméra intention est déclenché. Donc, toute image qui est pris n'est pas retourné directement à ma demande. (Bien sûr, vous pouvez appuyez sur le bouton retour pour retomber dans la galerie et sélectionnez une image à partir de là, mais c'est un extra étape inutile et n'est pas du tout intuitif).

Donc, il y a un moyen de combiner les deux, ou vais-je avoir à offrir un menu à faire l'un ou l'autre de l'intérieur de ma demande? Semble que ce serait un cas d'utilisation...certes, je suis en manque de quelque chose?

120voto

Macarse Points 36519

Vous pouvez essayer de faire quelque chose comme ça:

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

Pour voir comment gérer le résultat de l'activité, veuillez vous référer à cette question.


Remarque: il est essentiel de déterminer si la caméra ou la galerie a été utilisée. Cela est indiqué dans cet exemple de code: http://stackoverflow.com/a/12347567/294884

13voto

CommonsWare Points 402670

Mise à JOUR: L'autre réponse, à l'aide de EXTRA_INITIAL_INTENTS, est l'un des meilleurs à ce stade. Au moment où j'ai écrit ma réponse, EXTRA_INITIAL_INTENTS n'existe pas encore, comme il a été ajouté dans l'API de Niveau 5.

Donc, il y a un moyen de combiner les deux ou vais-je avoir à offrir un menu à procédez de l'une ou de l'autre de l'intérieur de mon application?

Écrivez votre propre galerie qui a les caractéristiques que vous désirez.

Je pense à un menu serait plus simple.

Me semble qu'il serait d'un usage commun ...certes, je suis en manque de quelque chose?

Le développeur à côté de vous vont penser que le musée doit vous permettre de choisir à partir de la galerie locale ou d'autre hop à Flickr pour faire une sélection à partir de là. Un autre développeur pense que la caméra ne doit pas seulement permettre de prendre une photo via l'appareil photo, mais à "prendre une photo" via le choix de quelque chose à partir de la galerie, en inversant les choses de la façon de l'envisager. Encore un autre développeur pense que le musée doit permettre la cueillette de la galerie locale, ou Flickr, ou l'appareil photo, ou un associé à un réseau de webcam. Encore un autre développeur pense que la galerie est stupide et que les utilisateurs doivent simplement sélectionner des fichiers via un explorateur de fichier. Et ainsi de suite.

Tout cela dans un environnement (téléphones mobiles) où flash pour le système d'exploitation est à une prime.

Donc, à mon humble avis, il n'est pas complètement choquant que le core Android élection d'une équipe pour fournir des blocs de construction pour vous à assembler comme bon vous semble, plutôt que d'essayer de s'adapter à chaque modèle possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X