Imagen de ahorro de Android con cámara nativa

Me gustaría iniciar la cámara nativa de Android y guardar la imagen en una ubicación especificada. El problema es después de que haga clic en la foto, la vista previa viene con las opciones para guardar / descartar. Después de hacer clic en Guardar la cámara se vuelve a iniciar y la imagen que capturé no se guarda en la ubicación especificada. Más bien se guarda en la ubicación predeterminada. En realidad necesito la ubicación de la imagen que hice clic. Aquí está el código que utilizo para lanzar la cámara.

MediaScannerConnection_MSC = null; String fileName = String.valueOf(System.currentTimeMillis())+".jpg"; f = new File(Environment.getExternalStorageDirectory(), fileName); _imageUri = Uri.fromFile(f); // create new Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); startActivityForResult(intent, 1); 

Aquí está el código después de regresar de la cámara

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) { // use imageUri here to access the image final String imagePath = f.getAbsolutePath(); _MSC = new MediaScannerConnection(this, new MediaScannerConnectionClient() { public void onMediaScannerConnected() { _MSC.scanFile(imagePath, null); } public void onScanCompleted(String path, Uri uri) { _MSC.disconnect(); _MSC = null; } }); _MSC.connect(); } } } 

Qué error estoy haciendo aquí

Creo que tengo su respuesta, he buscado alto y bajo para este, y es un poco complicado.

En primer lugar, creo que en ciertos teléfonos,

 intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); 

Es ignorado

Así que mi mejor respuesta para usted es, no establezca el indicador "EXTRA_OUTPUT", en su lugar, deje que se ejecute normalmente y devuelva su URI nueva imagen. Luego, a partir de ahí, utilice:

 Uri u = intent.getData(); 

Para obtener la información de su nueva imagen, a continuación, desde allí, utilizo un FileOutputStream para escribir el archivo de imagen a la nueva ubicación que quiero tener. Luego, por último, elimino el archivo original. Todos los derechos reservados

Sé que es una especie de hokey, pero funciona, y creo que es bastante fiable. Todos los derechos reservados

Espero que eso ayude. Todos los derechos reservados

Jared

8-28-11

@llango J

Ok, bueno, aquí está el código completo, le invitamos a copiar y pegarlo y ver si puede conseguir que funcione 🙂

Para empezar, usted querrá llamar a la cámara de esta manera:

 startActivityForResult(CameraIntent, TAKE_PICTURE); 

Entonces, para el resultado usted querrá esto:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case TAKE_PICTURE: Uri u = intent.getData(); //Toast.makeText(getApplicationContext(), u.getPath(), Toast.LENGTH_SHORT).show(); WriteFiles(u); break; } } } 

Y entonces la magia principal ocurre en esta función:

 private void WriteFiles(Uri myNewPic) { String TempFilePath; String TempPath; File directory = new File("/sdcard/" + getString(R.string.app_name)); if (!directory.exists()) { directory.mkdirs(); } String TempPictureFile; try { TempPictureFile = myNewPic.getLastPathSegment() + ".jpg"; TempFilePath = directory.getPath() + "/" + TempPictureFile; FileOutputStream myOutStream = new FileOutputStream(TempFilePath); InputStream myInStream = getContentResolver().openInputStream(myNewPic); FileIO myFileIO = new FileIO(); myFileIO.copy(myInStream, myOutStream); //now delete the file after copying getContentResolver().delete(myNewPic, null, null); TempFilePaths.add(TempFilePath); } catch (Exception e) { Toast.makeText(getApplicationContext(), getString(R.string.ErrorOpeningFileOutput), Toast.LENGTH_SHORT).show(); } } 

Creo que son todas las partes que necesita para ahorrar con la aplicación de cámara nativa. Sin embargo, debo advertirle, acabé terminando abandonando este código porque necesitaba más flexibilidad y confiabilidad que esto ofreció (estoy pensando si usted utiliza esta aplicación en una tonelada de teléfonos diferentes, pude ver que tiene problemas por una razón U otro.Como por ejemplo, he tenido una tonelada de problemas como consecuencia de Samsung personalizar su interfaz de usuario, por lo tanto, las cosas funcionan muy bien en todos los teléfonos, pero los de Samsung. Así que acabé creando una aplicación de cámara propia, pero estoy seguro de que dependiendo de su aplicación esto podría funcionar muy bien para usted. De cualquier manera …. buena suerte! Todos los derechos reservados

Ok, aquí está mi clase FileIO que uso, lo siento, no incluí esto inicialmente:

 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class FileIO { private static final int BUFFER_SIZE = 1024 * 2; public FileIO() { // Utility class. } public int copy(InputStream input, OutputStream output) throws Exception, IOException { byte[] buffer = new byte[BUFFER_SIZE]; BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE); BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE); int count = 0, n = 0; try { while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) { out.write(buffer, 0, n); count += n; } out.flush(); } finally { try { out.close(); } catch (IOException e) { Log.e(e.getMessage(), null); } try { in.close(); } catch (IOException e) { Log.e(e.getMessage(), null); } } return count; } } 
  • WindowManager $ BadTokenException no se puede agregar la ventana
  • Detectar la carpeta de la cámara Android
  • Error de la cámara "No se puede conectar a la cámara" o en algunos teléfonos aparece el error "La cámara está usando otra aplicación"
  • Captura la imagen sin previsualización utilizando la API de la cámara2
  • Cómo liberar la cámara después de la actividad termina en Android?
  • Zoom de la cámara Google Glass XE16
  • En Android, ¿es posible cambiar la cámara (de adelante hacia atrás) y seguir grabando?
  • Java.lang.RuntimeException: No se puede conectar al servicio de cámara
  • La actividad de la cámara Android no vuelve a mi aplicación cuando se pulsa el botón OK
  • PreviewCallback onPreviewFrame no cambia los datos
  • ¿Cómo maneja el android las diferencias entre el tamaño de vista previa y el tamaño real de SufaceView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.