156 votes

Autoriser l'utilisateur à sélectionner une caméra ou une galerie pour l'image

Comme beaucoup ici, je suis nouveau sur Android développement. Ce que j'essaie de faire semble très simple, mais après quelques jours de recherche, je n'arrive pas à le comprendre.

J'ai une application qui permet à l'utilisateur de sélectionner plusieurs(jusqu'à 5) des images. Je suis à l'aide d'une ImageView. Lorsque l'utilisateur clique sur le ImageView, je voudrais, pour en permettre l'option a)sélectionnez l'image dans la galerie, ou b)utiliser l'appareil photo pour capturer une image.

J'ai commencé par utiliser le ACTION_GET_CONTENT intention, et qui fonctionne bien pour arriver à la galerie. Alors j'ai essayé d'utiliser le ACTION_PICK_ACTIVITY l'intention de permettre à l'utilisateur de choisir un appareil photo ou galerie:

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT);
gallIntent.setType("image/*"); 
Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
pickIntent.putExtra(Intent.EXTRA_INTENT, camIntent);
pickIntent.putExtra(Intent.EXTRA_INTENT, gallIntent)
pickIntent.putExtra(Intent.EXTRA_TITLE, "Select Source");
startActivityForResult(pickIntent, IMAGE_SELECTOR);

Mais il semble que je ne peux qu'ajouter un EXTRA_INTENT. Le menu s'afficher comme prévu, mais les seules options sont la Galerie et Fichiers....pas d'Appareil photo).

Est-il mieux/plus simple de le faire ce que je suis absent? Merci pour toute aide.

335voto

David Manpearl Points 5455

Comment lancer une seule Intention de sélectionner des images à partir de la Galerie ou de la Caméra, ou toute demande enregistrée pour parcourir le système de fichiers.

Plutôt que de créer une boîte de Dialogue avec une liste d'options d'Intention, il est beaucoup mieux d'utiliser l'Intention.createChooser afin d'obtenir l'accès à l'interface graphique les icônes et les noms courts des différentes "la Caméra", "Galerie" et même de la Troisième Partie du système de fichiers du navigateur des applications telles que "Astro", etc.

Cela explique comment utiliser le sélecteur d'intention et d'ajouter d'autres intentions.

private Uri outputFileUri;

private void openImageIntent() {

// Determine Uri of camera image to save.
final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
root.mkdirs();
final String fname = Utils.getUniqueImageFilename();
final File sdImageMainDirectory = new File(root, fname);
outputFileUri = Uri.fromFile(sdImageMainDirectory);

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for(ResolveInfo res : listCam) {
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        cameraIntents.add(intent);
    }

    // Filesystem.
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/*");
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

    // Chooser of filesystem options.
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");

    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));

    startActivityForResult(chooserIntent, YOUR_SELECT_PICTURE_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == RESULT_OK)
    {
        if(requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE)
        {
            final boolean isCamera;
            if(data == null)
            {
                isCamera = true;
            }
            else
            {
                final String action = data.getAction();
                if(action == null)
                {
                    isCamera = false;
                }
                else
                {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUri;
            if(isCamera)
            {
                selectedImageUri = outputFileUri;
            }
            else
            {
                selectedImageUri = data == null ? null : data.getData();
            }
        }
    }
}

33voto

Kevin Gaudin Points 6395

Vous devrez créer votre propre dialogue sélecteur de fusionner les deux l'intention de la résolution des résultats.

Pour ce faire, vous aurez besoin d'interroger le PackageManager avec PackageManager.queryIntentActivities() pour à la fois originale d'intentions et de créer la liste finale des possibles Intentions avec une nouvelle Intention pour chaque extrait d'activité comme ceci:

List<Intent> yourIntentsList = new ArrayList<Intent>();

List<ResolveInfo> listCam = packageManager.queryIntentActivities(camIntent, 0);
for (ResolveInfo res : listCam) {
    final Intent finalIntent = new Intent(camIntent);
    finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
    yourIntentsList.add(finalIntent);
}

List<ResolveInfo> listGall = packageManager.queryIntentActivities(gallIntent, 0);
for (ResolveInfo res : listGall) {
    final Intent finalIntent = new Intent(gallIntent);
    finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
    yourIntentsList.add(finalIntent);
}

(J'ai écrit ce directement ici si cela peut ne pas compiler)

Alors, pour plus d'info sur la création d'un dialogue personnalisé à partir d'une liste voir http://developer.android.com/intl/fr/guide/topics/ui/dialogs.html#AlertDialog

23voto

plexus Points 28

Malheureusement je ne suis pas autorisé à donner des réponses, mais j'ai un plus pour Dave Réponse. J'ai trouvé que son utilisation:

galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

pour l'une des intentions de montre à l'utilisateur la possibilité de sélectionner "documents" dans Android 4, que j'ai trouvé très déroutant. À l'aide de cette montre plutôt que la "galerie" de l'option:

Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

SRC: http://viralpatel.net/blogs/pick-image-from-galary-android-app/

13voto

Paulina D. Points 175

J'avais aussi ce problème et j'ai créé create et AlertDialog et utilisé la méthode setItems () avec l'écouteur DialogInterface:

 AlertDialog.Builder getImageFrom = new AlertDialog.Builder(Fotos.this);
                getImageFrom.setTitle("Select:");
                final CharSequence[] opsChars = {getResources().getString(R.string.takepic), getResources().getString(R.string.opengallery)};
                getImageFrom.setItems(opsChars, new android.content.DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(which == 0){
                            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
                        }else
                            if(which == 1){
                                Intent intent = new Intent();
                                intent.setType("image/*");
                                intent.setAction(Intent.ACTION_GET_CONTENT);
                                startActivityForResult(Intent.createChooser(intent,
                                    getResources().getString(R.string.pickgallery)), SELECT_PICTURE);
                            }
                        dialog.dismiss();
                    }
                });
 

8voto

Siddhpura Amit Points 3562

ce code vous aidera, en ce sens qu'il y a deux boutons pour Camera et un autre pour Gallery, et Image sera affiché dans ImageView

https://github.com/siddhpuraamitr/Choose-Image-From-Gallery-Or-Camera

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