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]