No puedes convertir una foto de 8 MP directamente a Bitmap, porque te pasará lo que te está pasando, que te quedarás sin memoria.
La máquina virtual de Java sólo gestiona al mismo tiempo entre 30 MB y 50 MB, dependiendo del móvil, si te pasas del tamaño asociado desbordas la memoria y la aplicación se muere. Una foto de 8MP convertida a Bitmap son más de 30 MB.
Soluciones al Bitmap:
1) ¿Para qué quieres mostrar una imagen de 8 MP en el móvil si no se va a apreciar? Comprímela mientras la conviertes a Bitmap.
2) Esta limitación no existe si lo haces con el NDK, así que si aún así quieres mostrar la imagen en 8 MP tendrás que hacerlo con una NativeActivity y programarlo todo con OpenGL. No se si teniendo la imagen direccionada en la memoria de C++ puedes pasarla a un ImageView, pero mucho me temo que en ese caso pasará a ocupar memoria Java y tendrás el mismo problema, pero no se, puedes probarlo.
En cuanto al String en Base64, 3/4 de lo mismo, el String en sí no puede ocupar más de 30 MB. Supongo que la imagen estará en JPEG y no será un RAW puro, en este caso no debería darte problemas, pero si aún así el String con la imagen entera ocupa más del límite de memoria, tendrás que enviarla a "cachos".