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
- Cámara: la función setDisplayOrientation no funciona para Samsung Galaxy ACE con Android 2.3.6
- ¿Alguna posibilidad de reducir el tiempo de obturación con el acceso a la cámara NDK de Android?
- ¿Cómo puedo encontrar la carpeta de imágenes de la cámara de un teléfono Android?
- Código de Android para convertir la cadena de base64 en mapa de bits
- Rotar una superficie de la cámaraVer a retrato
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í
- Cómo restringir el complemento para cambiar la cámara trasera / trasera en android / cordova
- La cámara se bloquea inesperadamente en el nexo de la galaxia
- androide muestran rectángulo en la cámara
- Android: detectar el brillo (cantidad de luz) en el entorno del teléfono con la cámara?
- La llamada getPicture () de PhoneGap no se guarda en la Galería en Android Phone
- No se pudo iniciar la función startPreview de la cámara
- La importación de android.hardware.camera2 no se puede resolver
- Cámara en modo Burst en Android, que puede tomar varias imágenes
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; } }
- Detección de un dispositivo compatible con 4G
- Extraer el archivo AndroidManifest.xml de apk usando sólo Java