Choisir une photo dans l'album
Pour illustrer la sélection d'une image et surtout comment connaitre la photo qu'à choisit l'utilisateur, nous allons utiliser le layout suivant composé de:Bouton: appeler la boite de dialogue 'sélectionnez une image',
TextView: afficher le chemin et le nom du fichier ainsi que les dimensions de l'image,
ImageView: visualiser la photo.
Définition du Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget32"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/btGallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dialogue Image"/>
<TextView
android:id="@+id/tvStatus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FAFAFA"/>
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Sélectionner une image dans la galerie
Pour lancer la boite de dialogue, j'ai choisi d'appeler l'objet Intent puis de fixer le filtre sur le type image. La particularité est que lorsque l'utilisateur a choisit une photo, son choix n'est pas directement connu. En fait, un événement est généré que l'on récupére dans une fonction globale onActivityResult. D'ou l'intéret de fixer une constante sur le type image pour pouvoir détecter la fin de la sélection.
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Sélectionner une photo dans la gallerie
* http://www.fobec.com/java/1161/selectionner-puis-afficher-une-image.html
* @author Axel fevrier 2015
*/
public class MainActivity extends Activity {
//constante pour définir l'id du type image
final static int SELECT_PICTURE = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Lier l'evenement btGalleryClick au boutton
((Button) findViewById(R.id.btGallery)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btGalleryClick(v);
}
});
}
/**
* Evenement du click boutton
* @param v
*/
public void btGalleryClick(View v) {
//Création puis ouverture de la boite de dialogue
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, ""), SELECT_PICTURE);
}
/**
* Retour de la boite de dialogue
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ImageView mImageView = (ImageView) findViewById(R.id.imageView1);
TextView textView = (TextView) findViewById(R.id.tvStatus);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case SELECT_PICTURE:
String path = getRealPathFromURI(data.getData());
Log.d("Choose Picture", path);
//Transformer la photo en Bitmap
Bitmap bitmap = BitmapFactory.decodeFile(path);
//Afficher le Bitmap
mImageView.setImageBitmap(bitmap);
//Renseigner les informations status
textView.setText("");
textView.append("Fichier: " + path);
textView.append(System.getProperty("line.separator"));
textView.append("Taille: " + bitmap.getWidth() + "px X " + bitmap.getHeight() + " px");
break;
}
}
}
/**
* Obtenir le chemin vers une ressource
* la fonction a été trouvé sur Stackoverflow
* @param contentURI
* @return
*/
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
}
Dans l'exemple l'image choisie est affichée dans un ImageView pour que l'on ait quelque chose de visuel. En fait, le plus souvent la photo est utilisée dans le cadre d'une action comme l'envoi via un SMS ou le partage sur les réseaux sociaux. Le principe reste de même, l'utilisateur sélectionne une photo sur son appareil mobile, on récupère le lien absolu vers la ressource puis l'image est envoyée.