Detectar la carpeta de la cámara Android
Me gustaría detectar la carpeta de la cámara en todos los dispositivos Android. De lo que he leído esta carpeta se diferencia de un fabricante a otro y no hay garantía de que habrá incluso una carpeta DCIM en el dispositivo.
Este es el método que estoy usando para obtener los archivos ahora:
- Carpeta java de Java ¿TRANSACCIÓN DE BINDER FALLA?
- Transferir InputStream a otro servicio (a través de límites de proceso) con ParcelFileDescriptor.createPipe () falla con "EBADF (número de archivo incorrecto)"
- Lista de nombres de carpetas de directorios de la tarjeta SD de Android
- Binder de Android que borra la identidad del llamante
- No se reconoce la carpeta de Google Drive al descargarla en la aplicación de Android
private static final Set<String> FILTER_FOLDERS = new HashSet<String>( Arrays.asList(new String[] { "camera", "100andro", "100media" })); private Set<String> getCameraPictures() { final String[] columns = new String[] { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.DATE_TAKEN, MediaStore.Images.ImageColumns.MIME_TYPE }; // Order by options - by date & descending final String orderBy = MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"; // Stores all the images from the gallery in Cursor final Cursor cursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // base URI for // the Images columns, // Which columns to return null, // Which rows to return (all rows) null, // Selection arguments (none) orderBy); // Ordering // Total number of images int count = cursor.getCount(); // Create an array to store path to all the images String[] picturesPath = new String[count]; if (cursor.moveToFirst()) { int dataColumn = cursor .getColumnIndex(MediaStore.Images.Media.DATA); int bucketColumn = cursor .getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); do { if (FILTER_FOLDERS.contains(cursor.getString(bucketColumn) .toLowerCase(Locale.getDefault()))) { // Store the path of the image picturesPath[cursor.getPosition()] = cursor .getString(dataColumn); } } while (cursor.moveToNext()); } // Close the cursor if (null != cursor) { cursor.close(); } return new HashSet<String>(Arrays.asList(picturesPath)); }
Pero esto es devolver imágenes de otros lugares también … ¿Cómo puedo recuperar sólo las imágenes tomadas con la cámara? Si no hay forma nativa de hacerlo, ¿dónde puedo encontrar cuáles son los nombres de las carpetas utilizadas por cada fabricante (tantas como hay) para poder filtrarlo por BUCKET_DISPLAY_NAME?
Gracias
LE:
He actualizado el método para obtener las imágenes en el dispositivo y también filtrar las carpetas.
- ¿Cómo escuchar dev / binder?
- Android Widgets permitido exceder el límite de transacción Binder de alguna manera?
- Android: hacer una carpeta en la memoria externa privada o protegida
- Cómo manejar: java.util.concurrent.TimeoutException: android.os.BinderProxy.finalize () tiempo de espera después de 10 segundos de errores?
- ¿Cómo notificar correctamente a MediaScanner sobre una carpeta, incluso en dispositivos Nexus / Kitkat?
- Rápida eliminación de la carpeta con más de 30000 imágenes en Android
- Adición de carpetas de java al proyecto de estudio de Android
- Guardar imagen de la cámara de Android en la carpeta personalizada
Hay docenas, quizás cientos, de aplicaciones para cámaras que vienen con dispositivos, para ir junto con miles de aplicaciones de cámara disponibles para descargar. Ninguno tiene que usar una "carpeta de cámara" particular y ninguno tiene que tener sus imágenes indexadas por MediaStore
.
La "carpeta de cámara" convencional para un dispositivo estará en la ubicación especificada por Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
. Es posible que ese directorio no exista todavía, si ninguna aplicación de cámara lo ha utilizado. Pero, de nuevo, no hay ningún requisito de que una aplicación de cámara lo use – pueden almacenar sus imágenes donde quiera, incluyendo lugares a los que no puede acceder (por ejemplo, almacenamiento interno, "la nube").
¿Cómo puedo recuperar sólo las imágenes tomadas con la cámara?
No puedes. Hay más de mil millones de teléfonos inteligentes en el planeta, y cualquier teléfono puede tener fotos en él tomadas por cualquier cámara de cualquier otro teléfono, cortesía de la foto de compartir aplicaciones y sitios. Esto está en la parte superior de las fotografías tomadas por las cámaras que no son teléfonos inteligentes. No es necesario que las imágenes tomadas por la propia cámara del dispositivo necesitan ser designadas de alguna manera como tales para su beneficio.
- Ocultar UI cuando se pulsa el volumen hacia arriba en un diálogo
- Facebook Slide menu-slide a la derecha en android?