Cómo capturar una imagen y almacenarla con la cámara nativa de Android
Tengo un problema al capturar una imagen y almacenarla desde la aplicación de cámara nativa. Aquí hay 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 la imagen se haya tomado y me devuelven a mi actividad original, cuando navego a mi tarjeta sd a través de Android DDMS Explorador de archivos la imagen no está allí. Alguien sabe por qué esto no se está salvando?
- Android Camera Preview - ¿Cómo 'congelar' la cámara?
- Uso de la cámara del teléfono a través de Intent - ¿la actividad nunca vuelve?
- Cámara Android bloqueada después de cerrar la fuerza
- Cómo podemos medir la distancia entre el objeto y la cámara del teléfono android
- ¿Qué formato es para la cámara de Android con raw pictureCallback?
- Manteniendo la cámara en pausa
- Android: orientación de la vista previa de la cámara en modo vertical
- ¿Cómo medir la altura, el ancho y la distancia del objeto usando la cámara?
- Cámara Android: se ejecuta en segundo plano desde el servicio
- Lectura de imágenes RGB con un ImageReader
- Imagen distorsionada con la cámara y getOptimalPreviewSize
- La vista previa de la cámara se bloquea después del bloqueo de la pantalla
- Android usando cámara frontal para tomar una foto
¿Ha comprobado cuál es la salida de Environment.getExternalStorageDirectory (), porque si no contiene un separador de archivos de arrastre (/), su imagen terminará en un directorio que no reside en la tarjeta SD, como por ejemplo:
/mnt/sdcardmake_machine_example.jpg
Cuando lo que realmente quieres es:
/mnt/sdcard/make_machine_example.jpg
Intente este código en su lugar:
_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg";
Aquí estaba el producto final en caso de que alguien siga visitando este hilo:
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. Solo usa
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á utilizando? Puede que ya esté arreglado en los dispositivos más recientes, pero también puede ser un problema. Así que aquí está una muestra completa de cómo superarlo. Problemas al guardar una foto en un archivo .
Debe realizar un escaneo de medios después de guardar la imagen
sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Agregue esta línea al archivo AndroidManifest.xml y elimine la extensión make_machine_example:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Comenzará a capturar la foto y almacenarla en la tarjeta SD.
- ¿Por qué Gradle necesita un archivo settings.gradle?
- Android: espera en la entrada del usuario desde el diálogo?