Pregunta

Estoy teniendo un problema de capturar una imagen y almacenarla en la aplicación de la cámara nativa. He aquí una muestra de algunos de mi código.

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg";
File file = new File( _path );
Uri outputFileUri = Uri.fromFile( file );

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

startActivityForResult( intent, 0 );

Después de que el cuadro se ha tomado y estoy de vuelta a mi actividad original devuelto, Cuando navego a mi tarjeta SD a través de Android DDMS de archivos Explorador de la imagen no está allí. Alguien sabe por qué esto no se está guardando?

¿Fue útil?

Solución

Ha comprobado lo que la salida de Environment.getExternalStorageDirectory () es, porque si no contiene un separador de archivo final (/), entonces su imagen va a terminar en un directorio que no reside en la tarjeta SD, tales como:

 /mnt/sdcardmake_machine_example.jpg

Cuando lo que realmente quiere es:

 /mnt/sdcard/make_machine_example.jpg

Prueba este código en su lugar:

 _path = Environment.getExternalStorageDirectory() + File.separator +  "make_machine_example.jpg";

Otros consejos

A continuación fue el producto final en caso de que alguien todavía se encuentra de visita en este tema:

public class CameraCapture extends Activity {

    protected boolean _taken = true;
    File sdImageMainDirectory;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {

            super.onCreate(savedInstanceState);         
                    File root = new File(Environment
                            .getExternalStorageDirectory()
                            + File.separator + "myDir" + File.separator);
                    root.mkdirs();
                    sdImageMainDirectory = new File(root, "myPicName");


                startCameraActivity();
            }
        } catch (Exception e) {
            finish();
            Toast.makeText(this, "Error occured. Please try again later.",
                    Toast.LENGTH_SHORT).show();
        }

    }

    protected void startCameraActivity() {

        Uri outputFileUri = Uri.fromFile(sdImageMainDirectory);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case 0:
            finish();
            break;

        case -1:

            try {
                StoreImage(this, Uri.parse(data.toURI()),
                        sdImageMainDirectory);
            } catch (Exception e) {
                e.printStackTrace();
            }

            finish();
            startActivity(new Intent(CameraCapture.this, Home.class));

        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
            _taken = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
    }

        public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
        Bitmap bm = null;
        try {
            bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
            FileOutputStream out = new FileOutputStream(imageDir);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

1. Sólo el uso

new File(Environment.getExternalStorageDirectory(),  "make_machine_example.jpg");

y no se preocupan de los separadores.

2. Ante el mismo problema antes. Los teléfonos SenseUI tienen una aplicación específica para cámara que no crea archivo. Qué dispositivo está usando? Ya puede fijarse en dispositivos más recientes pero también puede aún ser un problema. Así que aquí está una muestra completa de cómo superar los problemas que guardar una foto a un archivo .

Se debe realizar una exploración de los medios de comunicación después de guardar la imagen

 sendBroadcast(new Intent(
            Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Añadir esta línea en AndroidManifest.xml archivo y la extensión de eliminación make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Se comenzará a capturar la foto y tienda a la tarjeta SD.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top