I've created this demo that retrieve an image from the gallery and show it in an ImageView (after resampling the image itself) https://github.com/svappdroid/BitmapDemo
On a Galaxy Nexus I'm not able to open an image with dimension 4307x2894, logcat says "Bitmap Too Large to be uploaded in a texture"; the weird thing is that emulating the Galaxy Nexus I'm able to open the same image; why this behavior and how to solve it on the actual device?
The activity code is:
package com.example.bitmapdemo; import java.io.FileNotFoundException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; public class MainActivity extends Activity { public ImageView canvasImageView; public Button selectImageButton; public LinearLayout ll; public Bitmap image; //REQUEST CODE public static final int SELECT_IMAGE_REQ_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ll = (LinearLayout) this.findViewById(R.id.LinearLayout1); canvasImageView = (ImageView) this.findViewById(R.id.canvasImageView); selectImageButton = (Button) this.findViewById(R.id.selectImageButton); selectImageButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent selectImageIntent = new Intent(Intent.ACTION_GET_CONTENT); selectImageIntent.setType("image/*"); startActivityForResult(selectImageIntent, SELECT_IMAGE_REQ_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == SELECT_IMAGE_REQ_CODE) { switch(resultCode) { case(RESULT_OK): Uri imageUri = data.getData(); try { int inSampleSize = calculateInSampleSize(imageUri); image = resampleImage(imageUri, inSampleSize); canvasImageView.setImageBitmap(image); } catch(FileNotFoundException e){} } } } public int calculateInSampleSize(Uri imageUri) throws FileNotFoundException { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, opts); int imageWidth = opts.outWidth; int imageHeight = opts.outHeight; int inSampleSize = 4; //Get display dimension in order to calculate image ratio DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int reqWidth = displayMetrics.widthPixels; int reqHeight = displayMetrics.heightPixels; if(imageHeight > reqHeight || imageWidth > reqWidth) { final int heightRatio = Math.round((float)imageHeight / (float) reqHeight); final int widthRatio = Math.round((float) imageWidth / (float) reqWidth); inSampleSize = heightRatio And here is the xml code for the layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" 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=".MainActivity" > <ImageView android:id="@+id/canvasImageView" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:layout_gravity="center" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/selectImageButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/select_image_button" /> </LinearLayout>