problema en el uso de mapa de bits en android
Tengo el siguiente problema:
First activity
La cámara androide se abre y el usuario puede tomar una imagen. Una vez que la foto se toma la segunda actividad se lanza.
- IllegalArgumentException en Bitmap.getPixels ()
- Máscara de Android mapa de bits en lienzo gen un espacio negro
- Android: error de "intentar utilizar un mapa de bits reciclado" con Bitmaps temporales
- llamada a Bitmap.compress no devuelve - y ninguna excepción
- Android: FaceDetector no funciona. findface detecta siempre la cara cero;
Second activity
En esta actividad el usuario tiene la posibilidad de ver la foto. Por eso recibo de la primera actividad el cuadro, así:
Bundle extras = getIntent().getExtras();
y creo el siguiente mapa de bits:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 5; options.inDither = true; byte[] imageData = extras.getByteArray("imageData"); myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); Matrix mat = new Matrix(); mat.postRotate(90); bitmapResult = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true); //...operations on the bitmapResult
El bitmap del resultado es el almacenado en el sdcard
y antes de salir de esta actividad reciclo mi mapa de bits para evitar problema de memoria:
bitmapResult.recycle(); bitmapResult=null;
Después de todo esto se pasa a la actividad 3.
Third activity
En esta actividad el usuario puede ver la imagen en tamaño diferente. La imagen se toma de la sdcard
.
El gran problema es cuando el usuario pulsa el botón de retroceso se toma de la actividad three
a la actividad two
, pero mi aplicación se bloquea porque está tratando de hacer operations on bitmap that has been recycled.
Y si no reciclo el mapa de bits en la segunda actividad me sale OutOfMemeory Exception
cuando voy unas cuantas veces arriba y abajo a través de mi aplicación.
¿Algunas ideas?
- No se puede comprimir un mapa de bits reciclado
- Combinar dos mapas de bits en android
- Bitmap.compress devuelve false para la imagen dibujada
- Mapa de bits mutable de Android
- Cómo tomar una captura de pantalla de SurfaceView con una vista previa de la cámara
- ¿Hay una solución de reproducción de video más rápida que las funciones de AndroidBitmap_xxx?
- Widget de la aplicación Android con renderizado personalizado
- Crear Bitmap NullPointerException
Cuando su usuario está en la Actividad 2 , no vaya directamente a la Actividad 3 (la galería). Primero, termine la Actividad 2 y devuelva un resultado a la Actividad 1 . A continuación, inicie la Actividad 3 .
Su actividad principal / principal:
public class TakeAPicture extends Activity { public static final int REQUEST_PICTURE_WAS_TAKEN = 100; public static final int REQUEST_SHOW_GALLERY = 101; public static final int RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY = 102; public static final int RESULT_BACK_FROM_GALLERY = 103; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.takeapicture); Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(getApplicationContext(), PictureTaken.class); startActivityForResult(i, REQUEST_PICTURE_WAS_TAKEN); } }); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_PICTURE_WAS_TAKEN: if (resultCode == RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY) { Intent i = new Intent(getApplicationContext(), Gallery.class); startActivityForResult(i, REQUEST_SHOW_GALLERY); } break; default: break; } } }
Y en tu segunda actividad tienes que hacer algo como esto:
public class PictureTaken extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picturetaken); Button btn = (Button) findViewById(R.id.button2); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PictureTaken.this .setResult(TakeAPicture.RESULT_PICTURE_WAS_TAKEN_SHOW_GALLERY); PictureTaken.this.finish(); } }); } }
Saludos
- ¿Cómo puedo convertir mi aplicación en aplicación de sistema?
- BroadcastReceiver.onReceive se llama dos veces para user_present