title: Bitmap Too Large to be uploaded in a Texture (Differences between Emulator and Actual Device)
body: <p>I've created this demo that retrieve an image from the gallery and show it in an ImageView (after resampling the image itself) <a href="https://github.com/svappdroid/BitmapDemo" rel="nofollow">https://github.com/svappdroid/BitmapDemo</a></p>
  
  <p>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?</p>
  
  <p>The activity code is:</p>
  
  <pre><code>
      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 </pre>
  
  <p>And here is the xml code for the layout:
  <pre><code></p>
  
  <pre>&lt;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" &gt;
  
      &lt;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" /&gt;
  
      &lt;Button
          android:id="@+id/selectImageButton"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/select_image_button" /&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p></pre></code></p>