33

Tengo un problema al capturar una imagen y almacenarla desde la aplicación de la cámara nativa. Aquí hay una muestra de algunos de mis códigos.Cómo capturar una imagen y almacenarla con la cámara Android nativa

_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 regresar de nuevo a mi actividad original, Cuando navego a mi tarjeta SD a través de Android DDMS Explorador de archivos que la imagen no está allí. Alguien sabe por qué esto no se guarda?

+0

Hola a todos, quiero captura de imágenes por la cámara nativa de Android y almacenarlo .so que he hecho de recompensas becoz preocupante con él –

+0

Paresh ¿cuáles son tus problemas con la captura de la imagen? ¿El enfoque que se muestra en esta pregunta no funciona para usted? – Janusz

+0

@Janusz Tengo que poner una vista de texto (nombre de la actividad), un botón (en la parte inferior) y en la mitad de la pantalla, la vista previa de la cámara está allí y en el evento de clic de botón, se debe hacer clic en la foto y la foto en otra. actividad –

Respuesta

20

¿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"; 
+2

Sí, puedo confirmar que tendrá que añadir el separador de archivos –

14

1. Simplemente use

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

y no se preocupe por los separadores.

2. Se enfrentó al mismo problema antes. Los teléfonos SenseUI tienen una aplicación de cámara personalizada que no crea archivos. ¿Qué dispositivo estás usando? Es posible que ya se haya solucionado en los últimos dispositivos, pero también puede ser un problema. Así que aquí hay una muestra completa de cómo superarlo Problems saving a photo to a file.

25

Aquí 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

¿Es necesario establecer permisos adicionales en el manifiesto? No puedo dar mi propio nombre para el archivo de imagen guardado en sd – Vincent

+0

sí ... \t ninjasense

+0

¡Hola Ninja! ¿Puedo saber, qué es "Home.class" ???? se dice que para crear una clase/enum, etc., soy nuevo en la programación de Android. – iankits

-5

añadir esta línea en AndroidManifest.xml archivo y eliminar la extensión make_machine_example:

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

Comenzará para capturar la foto y almacenarla en la tarjeta SD.

+0

no almacenará la imagen capturada. –

1

debe realizar una operación de barrido medios de comunicación después de guardar la imagen

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