android choisir des images de la galerie

197

Je veux créer un sélecteur d'images à partir de la galerie. J'utilise du code

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

Mon problème est que dans cette activité et les fichiers vidéo sont affichés. Existe-t-il un moyen de filtrer les fichiers affichés afin qu'aucun fichier vidéo ne soit affiché dans cette activité?

Buda Gavril
la source
3
Cet article décrit bien comment choisir des images dans la galerie: androidbitmaps.blogspot.com/2015/04/…
Andy Res
Il y a une question similaire comme vous. stackoverflow.com/a/31382240/1835650
TeeTracker

Réponses:

347

Absolument. Essaye ça:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

N'oubliez pas également de créer la constante PICK_IMAGE , afin que vous puissiez reconnaître quand l'utilisateur revient de la galerie d'images. Activité:

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

C'est ainsi que j'appelle la galerie d'images. Mettez-le et voyez si cela fonctionne pour vous.

ÉDITER:

Cela fait apparaître l'application Documents. Pour permettre à l'utilisateur d'utiliser également toutes les applications de galerie qu'il a pu installer:

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

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);
JMRboosties
la source
6
J'obtiens 2 options sur ce "Système Android", "Documents". Si je sélectionne Système Android, il me présente Galerie et Photos. Comment puis-je me débarrasser de cette liste d'options intermédiaires?
Uday
4
@Uday, c'est simplement parce que vous n'avez pas défini la valeur par défaut.
Tristan Wiley
13
À quoi la constante PICK_IMAGE doit-elle être définie? Il dit "Impossible de résoudre le symbole" PICK_IMAGE "
Michael
3
@Michael, la constante PICK_IMAGE contient toute valeur statique statique déterminée par vous sur cette classe, elle est ensuite utilisée sur la @Overridefonction onActivityResult(int requestCode, resultCode, Intent data), où il est recommandé d'utiliser cette constante pour vérifier le requestCodeparamètre avant de faire n'importe quelle action :)
Gabriel Checchia Vitali
Vous pouvez récupérer le bitmap à partir de la méthode onActivityResult (...) avec le code suivant (en supposant RESULT_OK): Bitmap bitmap = data.getExtras (). GetParcelable ("data");
Shn_Android_Dev
197

Parfois, vous ne pouvez pas obtenir un fichier de l'image que vous choisissez. C'est parce que celui choisi vient de Google+, Drive, Dropbox ou de tout autre fournisseur.

La meilleure solution consiste à demander au système de choisir un contenu via Intent.ACTION_GET_CONTENT et d'obtenir le résultat avec un fournisseur de contenu.

Vous pouvez suivre le code ci-dessous ou consulter mon résumé mis à jour .

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}
Benjamin
la source
14
if(resultCode == Activity.RESULT_OK) {...}peut être utilisé pour détecter le succès / l'annulation
Thamme Gowda
Comment pouvez-vous obtenir le chemin?
livrez
@delive, je pense que vous pourriez essayer new File(data.getData()).getAbsolutePath()Juste une supposition, je ne l'ai pas essayé
Quelqu'un Quelque part
1
Avertissement d'exception FileNotFound par Android Studio en fragment dans getActivity().getContentResolver().openInputStream(data.getData());.
Iqbal
1
Cela fonctionne sur certains appareils sur lesquels le chemin du fichier n'est pas renvoyé. Cependant, je ne vois aucun moyen de déterminer - une fois que j'ai le InputStream - comment comprendre l'orientation de l'image.
Casey Perkins
30
public void FromCamera() {

    Log.i("camera", "startCameraActivity()");
    File file = new File(path);
    Uri outputFileUri = Uri.fromFile(file);
    Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

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

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && resultCode == RESULT_OK
            && null != data) {

        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}
ASHISH KUMAR Tiwary
la source
Merci beaucoup. Cette réponse m'a aidé à télécharger l'image plus tard
Rosário Pereira Fernandes
Je suppose que vous voulez dire le cas 1: au lieu du cas -1: dans le commutateur du OnActivityResult.
Mathias
Je sais que c'est une nouvelle question mais, pourquoi avons-nous fait tout cela pour obtenir le chemin de l'image, que renvoie alors data.getData?
moumenShobakey
quelle est la valeur de path? dansFile file = new File(path);
Ravi Vaniya
23

Vous pouvez utiliser cette méthode pour choisir l'image de la galerie. Seules les images seront affichées.

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

et remplacer onActivityResult as

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }
Abhishek
la source
2
@Abhishek ... où avez-vous trouvé la liste des extras autorisés pour l'intention ACTION_PICK? Merci!
Johnny Wu
1
N'oubliez pas d'ajouter des autorisations d'exécution pour READ_EXTERNAL_STORAGE et WRITE_EXTERNAL_STORAGE pour le niveau API 23 et supérieur. Sinon, vous risquez de ne pas obtenir le bitmap de la galerie comme non nul. Voir stackoverflow.com/a/35285667/3341089
oguzhan
1
L'appel à setType après avoir défini l'URI effacera les données.
Taslim Oseni
11

Voici un exemple complet de demande de permission (si besoin), choisissez l'image dans la galerie, puis convertissez l'image en bitmap oufile

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Activité

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

Démo
https://github.com/PhanVanLinh/AndroidPickImage

Phan Van Linh
la source
Ce n'est rien de moins qu'une bibliothèque, en particulier avec cette fonction de recadrage et de rapport d'aspect. Je n'ai jamais su qu'une telle chose existait. Merci beaucoup monsieur.
Lalit Fauzdar
1
De retour ici, ce n'est pas aussi bon que j'espérais voir les premières impressions. Il ne sélectionne pas l'image lorsqu'il est édité avec snapseed, pas de plantage mais pas d'image, l'application de galerie par défaut de Huawei ne fait rien lorsque je clique sur suivant après la modification, elle ne modifie pas l'image lorsqu'elle est sélectionnée à partir de photos Google, ramenez-la sans lui directement. Cela ne fonctionne bien que si je choisis la galerie par défaut de Huawei et Google Photos pour la modifier.
Lalit Fauzdar
2

Si vous recherchez uniquement des images et une sélection multiple.

Regardez @ une fois https://stackoverflow.com/a/15029515/1136023

C'est utile pour l'avenir. Personnellement, je me sens bien en utilisant MultipleImagePick .

Bhavesh Hirpara
la source
quel est le moyen le plus rapide d'utiliser MultipleImagePick comme bibliothèque? Il s'agit d'un projet / application autonome ..
ticofab
2

Juste pour offrir une mise à jour de la réponse pour les personnes avec API min 19, selon la documentation:

Sur Android 4.4 (API niveau 19) et supérieur, vous avez la possibilité supplémentaire d'utiliser l'intention ACTION_OPEN_DOCUMENT, qui affiche un sélecteur contrôlé par le système, contrôlé par l'interface utilisateur, qui permet à l'utilisateur de parcourir tous les fichiers que d'autres applications ont mis à disposition. À partir de cette interface utilisateur unique, l'utilisateur peut choisir un fichier à partir de n'importe quelle application prise en charge.

Sur Android 5.0 (API niveau 21) et supérieur, vous pouvez également utiliser l'intention ACTION_OPEN_DOCUMENT_TREE, qui permet à l'utilisateur de choisir un répertoire auquel une application cliente peut accéder.

Ouvrir des fichiers à l'aide de l'infrastructure d'accès au stockage - Android Docs

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
P Fuster
la source
0

Pour seulement choisir parmi les locaux, ajoutez ceci:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

Et ce travail agréable:

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)
Burak Dizlek
la source
-7

Vous pouvez le faire plus facilement que cette réponse:

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);
Alireza Taghizadeh
la source
je le fais, et cela a fonctionné. si vous avez besoin d'utiliser pour déposer par exemple pour envoyer au serveur, vous devez utiliser d'autres moyens, mais juste pour charger une image dans imageview, vous pouvez faire cette solution facile.
Alireza Taghizadeh
5
Bienvenue chez SO! Au lieu de commenter votre propre message, vous pouvez également modifier votre message. Si votre commentaire est censé expliquer la réponse, alors pourquoi ne pas le mettre dans la réponse elle-même? Personnellement, je ne vois pas en quoi votre réponse (tardive) à cette ancienne question est liée à la question. Puis-je suggérer de me concentrer sur les réponses aux questions qui n'ont pas encore de réponse acceptée?
cfi
1
je ne peux pas trouver de questions android. comment puis-je voir juste les questions android?
Alireza Taghizadeh
3
Veuillez lire les pages d'aide. En outre, les commentaires ne concernent pas les discussions sur le fonctionnement du site, vous pouvez utiliser des salles de discussion pour des discussions en direct avec d'autres utilisateurs, et vous pouvez poser des questions spécifiques sur Meta (aide-> Meta)
cfi