Error al guardar el archivo de la cámara de Android

Estoy desarrollando una aplicación para Android basada en la función de cámara. Tengo algunos problemas en mi programa que no puedo resolver. Mi mCurrentImagePath siempre es nulo cuando se inicializa. El logcat muestra que nunca golpea el takepicture() función, por lo que nunca se le da un valor. Traté de dejar el subproceso en reposo para que la operación posterior al mapa de bits pueda esperar hasta que la cámara guarde bien la imagen, pero aún no funciona. Pero si no leo la foto que tomé, la aplicación funciona perfectamente, puede guardar bien la foto. También traté de usar bitmapfactory.decodebyte() para operar directamente en los metadatos, pero también falló. ¿Alguien puede darme alguna idea de en qué parte me equivoqué? Eso sería realmente útil. ¡¡¡Muchísimas gracias!!!

private static final String IMAGE_DIRECTORY ="sdcard/DCIM/Camera";
public static String mCurrentImagePath = null;
private CameraView cv;
private Camera mCamera = null;

public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {

        try{
            isFinish = false;
            long timeTaken = System.currentTimeMillis();
            mCurrentImagePath = IMAGE_DIRECTORY + "/"+ createName(timeTaken) + ".jpg";
            File file = new File(mCurrentImagePath);
            Log.d("path", "mCurrentImagePath_takepicture = " + mCurrentImagePath);
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.flush();
            fos.close();
            Toast.makeText(OpenASURF.this, "saving the picture", Toast.LENGTH_SHORT).show();
            isFinish = true;
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview();
        // TODO Auto-generated method stub
    }
}; 

cv.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        if(mCamera != null) {
            mCamera.takePicture(null, null, pictureCallback);
            // let the system wait until finish taking the pictures.
            //while(isFinish == false) {
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //}
            Log.d("path", "mCurrentImagePath_over1 = " + mCurrentImagePath);
            Bitmap bmp = null;

            bmp = BitmapFactory.decodeFile(mCurrentImagePath);
            Log.d("path", "mCurrentImagePath_over2 = " + mCurrentImagePath);
        }

preguntado el 18 de septiembre de 12 a las 17:09

2 Respuestas

No importa cuánto tiempo esperes después takePicture(), la onPictureTaken() la devolución de llamada se llamará solo después de su OnClick() devoluciones: todos usan la aplicación Hilo principal.

Puedes llamar

BitmapFactory.decodeFile(mCurrentImagePath);

en tu onPictureTaken(), o puede publicar un evento de onPictureTaken() a tu actividad.

Respondido el 19 de Septiembre de 12 a las 08:09

Gracias por tu consejo, realmente ilumina mi mente de este problema. Intenté agregar mi parte de cálculo en onPictureTaken(), pero también muestra un OutofMemoryError. ¿Tienes alguna idea al respecto? - Zhuorui

Usaré la imagen que tome de la cámara para el reconocimiento de imágenes. Calcularé su descriptor SURF para una mayor coincidencia. - Zhuorui

Quiero decir, ¿qué haces para salir de la memoria? ¿Qué ves en el registro? Pero esto probablemente valga la pena una pregunta propia. - Alex Cohn

Terminé la aplicación, gracias por su ayuda, uso AsynTask para el cálculo de back-end que funciona perfectamente. - Zhuorui

Is IMAGE_DIRECTORY ¿correcto? esperaría que fuera /sdcard/DCIM/Camera, con la barra inclinada de apertura.

Mejor aún sería obtener la ruta de la imagen de la manera correcta: DIRECTORIO_FOTOS

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");

Respondido el 18 de Septiembre de 12 a las 21:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.