Seleccionar imagen via Intent

Una manera sencilla de pedirle a usuario que seleccione una imagen del dispositivo es mediante un Intent que abra aplicaciones como galerías o gestores de archivos.

En el articulo de hoy veremos como cargar una imagen seleccionada por el usuario en un control ImageView. Para ello empezaremos definiendo nuestro archivo layout en el que añadiremos los controles ImageView y Button dentro de un RelativeLayout :

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.mscdroidlabs.seleccionaimagen.MainActivity" >

    <ImageView
        android:id="@+id/imagen"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

    <Button
        android:id="@+id/btn_seleccion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imagen"
        android:layout_centerHorizontal="true"
        android:text="@string/seleccionar" />

</RelativeLayout>

Una vez creado el layout, nos dirigimos a nuestra Activity principal e instanciamos un nuevo Intent (líneas 36-39) en el evento onClick de nuestro botón.

línea 37 : Con setAction(Intent.ACTION_GET_CONTENT);  le decimos al sistema que queremos recuperar algún tipo dato.

línea 39 : Definimos el tipo de archivo a recuperar con setType(«image/*»); en este caso una imagen.

El siguiente paso es arrancar una nueva Activity y controlar su resultado al cerrarse.

línea 40 : startActivityForResult(intent, RCode); El primer parámetro es el intent anteriormente creado, el segundo un simple int para identificar que activity se ha cerrado.

 

Una vez se pulse el botón veremos las imágenes del dispositivo en nuestro gestor de archivos por defecto. Al seleccionar una imagen controlamos el evento onActivityResult(int requestCode, int resultCode, Intent data) para recuperarla y mostrarla en nuestro ImageView (líneas 47 – 69).

 

package es.mscdroidlabs.seleccionarimagen;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;


public class MainActivity extends Activity {

    private ImageView imagen;
    private Button btn_seleccion;
    private int RCode = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imagen = (ImageView)findViewById(R.id.imagen);
        btn_seleccion = (Button)findViewById(R.id.btn_seleccion);

        btn_seleccion.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, RCode);

            }
        });

    }

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

        Bitmap btp_img = null;
        InputStream in_stream;

        if (resultCode == Activity.RESULT_OK && requestCode == RCode)

            try {
                if (btp_img != null) {
                    btp_img.recycle();
                }
                in_stream = getContentResolver().openInputStream(
                        data.getData());
                btp_img = BitmapFactory.decodeStream(in_stream);
                in_stream.close();
                imagen.setImageBitmap(btp_img);
                btn_seleccion.setText(getResources().getString(R.string.modificar));
            }  catch (IOException e) {
                e.printStackTrace();
            }
        super.onActivityResult(requestCode, resultCode, data);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

 

Aquí tenéis el resultado.

 

[tweetthis url=»http://goo.gl/iQfXbO»]Selección de imágenes mediante Intent[/tweetthis]

Mario Camí

Desarrollador de aplicaciones Android. Amante de todo lo Open Source, de los videojuegos y nuevas tecnologías. En mi tiempo libre comparto todo lo aprendido y lo que aprendo en el desarrollo de Android a modo de artículo en el blog. La información nos hará libres!

También te podría gustar...