Android / Java: Guardar una matriz de bytes en un archivo (.jpeg)

Estoy desarrollando una aplicación para Android, y parte de la aplicación tiene que tomar fotos y guardarlas en la tarjeta SD. El método onPictureTaken devolvió una matriz de bytes con los datos de la imagen capturada.

Todo lo que necesito hacer es guardar la matriz de bytes en un archivo de imagen .jpeg. He intentado hacer esto con la ayuda de BitmapFactory.decodeByteArray (para obtener un Bitmap) y luego bImage.compress (a un OutputStream), un OutputStream simple y un BufferedOutputStream. Los tres métodos parecen darme el mismo error extraño. Mi teléfono Android (cámara de 8MP y un procesador decente) parece guardar la foto (el tamaño parece correcto), pero de manera corrupta (la imagen se corta y cada corte se desplaza; o simplemente obtengo líneas casi horizontales de varios colores) ; y Lo extraño es que una tableta Android con una cámara de 5MP y un procesador rápido parece guardar la imagen correctamente.

Así que pensé que tal vez el procesador no pueda seguir guardando imágenes grandes, porque obtuve Excepciones OutOfMemory después de aproximadamente 3 imágenes (incluso con una calidad de compresión de 40). Pero entonces, ¿cómo lo hace la aplicación integrada de la cámara, y mucho más rápido también? Estoy bastante seguro (de depuración) de que OutputStream escribe todos los datos (bytes) y debería estar bien, pero todavía está dañado.

*** En resumen, ¿cuál es la forma mejor / más rápida (que funciona) para guardar una matriz de bytes en un archivo jpeg?

Gracias de antemano, Mark

code que he probado (y algunas otras pequeñas variaciones):

    try {
        Bitmap image = BitmapFactory.decodeByteArray(args, 0, args.length);
        OutputStream fOut = new FileOutputStream(externalStorageFile);
        long time = System.currentTimeMillis();
        image.compress(Bitmap.CompressFormat.JPEG,
                jpegQuality, fOut);
        System.out.println(System.currentTimeMillis() - time);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
    }

    try {
        externalStorageFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(externalStorageFile);
        fos.write(args);
        fos.flush();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta