2011-06-06 17 views
13

Sé que mi pregunta es un duplicado de this question y this one. Pero aun así tengo algunos problemas, así que no intentes cerrar o rechazar a mis amigos. Por favor repasa la pregunta completamente.Problema de ruta de cámara específica de dispositivo Android

En mi aplicación, deseo almacenar imágenes en la misma carpeta donde las almacena la cámara nativa del dispositivo. Según mi investigación, descubrí que cada dispositivo almacena las imágenes en un nombre diferente y en una carpeta diferente.

Eso es:

  • Nexus-One almacena sus archivos de la cámara en una carpeta denominada Camera(/ sdcard/DCIM/cámara).

  • Todos los dispositivos de HTC almacenar sus archivos de la cámara en una carpeta denominada 100MEDIA(/ sdcard/DCIM/100MEDIA).

  • Sony Xperia x10 almacena sus archivos de la cámara en una carpeta denominada 100ANDRO(/ sdcard/DCIM/100ANDRO).

  • Motorola Milesstone almacena sus archivos de la cámara en una carpeta denominada Camera(/ sdcard/DCIM/cámara).

así que quería saber si es posible conseguir mediante programación este camino para que pueda almacenar las imágenes tomadas de mi aplicación a la misma ubicación?

Cuando estaba buscando en Google descubrí que es mejor crear una carpeta externa propia para que pueda almacenar las imágenes en esa ruta con el nombre que estoy especificando. Después de eso también en el dispositivo HTC de API versión 3 (Android 1.5) descubrí que solo se está creando la carpeta, pero la imagen se guarda en su lugar predeterminado con un nombre propio.

¿Cómo resolver este problema? ¿No es posible encontrar la ruta específica y el nombre de la imagen que se guarda para cada dispositivo? Por favor, ayúdenme amigos.

+0

Creo que todos los teléfonos "recientes" (v4.0 +) usan la carpeta 'Camera'. –

+0

@ AlikElzin-kilaka my xperia z3 y z5 ambas tiendas v5.1.1 en DCIM/100ANDRO FYI –

Respuesta

4

Utilice getExternalStorageDirectory() si el nivel de la API está por debajo de 7 y luego añada/Imágenes para obtener la ruta de almacenamiento de las fotos.

para nivel API> 7 use getExternalStoragePublicDirectory (DIRECTORY_PICTURES).

+0

lo siento, no puedo entenderlo, ¿puedes explicarlo con un poco de código? –

+1

Consulta http://developer.android.com/ guide/topics/data/data-storage.html -> Guardar archivos compartidos. –

+0

Pero fotos/- Todas las fotos (excluyendo las tomadas con la cámara). – degratnik

3

uso el siguiente código

String pictures_path = Utils.getRealPathFromURI(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
File path = new File(pictures_path); 
if (path.isFile()) 
    path = path.getParentFile(); 

Dónde: Utilidades

public static String getRealPathFromURI(Uri content_uri, int media_type) { 
    String column = MediaType.MEDIA_TYPE_PICTURE;  
    ContentResolver content_resolver = getContext().getContentResolver(); 
    String [] proj = { column }; 
    Cursor cursor = content_resolver.query(content_uri, 
        proj, // Which columns to return 
        null, // WHERE clause; which rows to return (all rows) 
        null, // WHERE clause selection arguments (none) 
        null); // Order-by clause (ascending by name) 
    int column_index = cursor.getColumnIndexOrThrow(column); 
    if (!cursor.moveToFirst()) 
     return null; 
    return cursor.getString(column_index); 
} 

EDIT: Por desgracia, el método anterior puede no siempre funciona :(...

Finalmente lo hice manuales chequeos:

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    if (path.exists()) { 
     File test1 = new File(path, "100MEDIA/"); 
     if (test1.exists()) { 
      path = test1; 
     } else { 
      File test2 = new File(path, "100ANDRO/"); 
      if (test2.exists()) { 
       path = test2; 
      } else { 
       File test3 = new File(path, "Camera/"); 
       if (!test3.exists()) { 
        test3.mkdirs(); 
       } 
       path = test3; 
      } 
     } 
    } else { 
     path = new File(path, "Camera/"); 
     path.mkdirs(); 
    } 
2

Esta es la función que estoy usando. No nombra específicamente directorios 100Media o Camera. Simplemente comienza en la carpeta/DCIM y mira a sus hijos. Si el niño no es a.directorio de miniaturas (o lo es, dependiendo de lo que esté haciendo), luego mire a sus hijos y obténgalos. También obtiene imágenes en el directorio/DCIM.

File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    File thumbnails = new File(dcim, "/.thumbnails"); 
    File[] listOfImg = dcim.listFiles(); 
    if (dcim.isDirectory()){ 
     //for each child in DCIM directory 
     for (int i = 0; i < listOfImg.length; ++i){ 
      //no thumbnails 
      if(!listOfImg[i].getAbsolutePath().equals(thumbnails.getAbsolutePath())){ 
       //only get the directory (100MEDIA, Camera, 100ANDRO, and others) 
       if(listOfImg[i].isDirectory()) { 
        //is a parent directory, get children 
        File[] temp = listOfImg[i].listFiles(); 
        for(int j = 0; j < temp.length; ++j) { 
         f.add(temp[j].getAbsolutePath()); 
        } 
       }else if(listOfImg[i].isFile()){ 
        //is not a parent directory, get files 
        f.add(listOfImg[i].getAbsolutePath()); 
       } 
      } 
     } 
    } 

He estado buscando una solución a este problema yo mismo. Dado que diferentes fabricantes tienen diferentes convenciones de nomenclatura para carpetas de cámara, esto parece abarcar todo lo mejor del terreno. Me funciona bastante bien.

Cuestiones relacionadas