Pérdida de memoria de Android, sin variables estáticas

Soy un desarrollador principiante de Android, y como proyecto de práctica, estoy tratando de hacer una actividad que pueda tomar una foto, guardarla en el almacenamiento externo y mostrarla en un ImageView. Casi todo parece estar funcionando, sin embargo, parece que tengo una pérdida de memoria.

Cuando la orientación de la pantalla cambia, creo que la actividad se destruye y luego se recrea. Para continuar mostrando la imagen, estoy almacenando la ruta de acceso a la imagen como una cadena en un paquete en onSaveInstanceState y restableciendo la imagen en onResotreInstanceState. Al tomar fotos de 5mp, puedo rotar la pantalla una vez, y luego, en la segunda rotación, la aplicación se bloquea y LogCat informa de un error de falta de memoria. Con imágenes de menor resolución, obtengo más rotaciones, pero la aplicación aún se bloquea y recibo el mismo error.

He estado leyendo sobre las fugas de memoria de Android, y todo parece decir que no se deben usar Drawables estáticos, que pueden tener referencias a la vista, y evitar que la máquina virtual libere la memoria. Por lo que puedo decir, no estoy haciendo nada como esto que mantendría las referencias. Si alguien me puede ayudar a localizar mi error, realmente lo apreciaría. Aquí está el código:

public class CameraTestsActivity extends Activity {

private Uri fileUri;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

public void takePicture(View view){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputImageFileUri();
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    startActivityForResult(intent, 0);
}

private static Uri getOutputImageFileUri() {
    return Uri.fromFile(getOutputImageFile());
}

private static File getOutputImageFile(){
    Log.d("CameraTestsActivity", "Storage state: " + Environment.getExternalStorageState());
    if (Environment.getExternalStorageState().equals("mounted")){
        File mediaStorageDirs = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures" + "/CameraTestsActivity");
        if (! mediaStorageDirs.exists()){
            if (! mediaStorageDirs.mkdirs()){
                Log.d("CameraTestsActivity", "Failed to create directories");
                mediaStorageDirs = null;
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File imageFile = new File(mediaStorageDirs.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        mediaStorageDirs = null;
        return imageFile;


    }
    Log.d("CameraTestsActivity", "Storage state bad");
    return null;
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK){
        if (requestCode == 0){
            setImage();
        }
    }
    else{
        super.onActivityResult(requestCode, resultCode, data);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    fileUri = Uri.parse(savedInstanceState.getString("uri"));
    setImage();
    super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("uri", fileUri.toString());
    super.onSaveInstanceState(outState);
}

private void setImage(){
    ImageView image = (ImageView)findViewById(R.id.imageView1);
    File file = new File(fileUri.toString().substring(7));
    if (!file.exists())
        Log.d("CameraTestsActivity", "File " + fileUri.toString().substring(7) + "does not exist");
    image.setImageURI(fileUri);
}

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta