2011-06-30 11 views
5

Tengo que abrir el archivo adjunto desde la aplicación de Gmail a través de mi aplicación.Aplicación de Gmail para Android: problema URI de archivo adjunto de correo

me sale enlace en el patrón de contenido: //gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false

Mi problema es que el vínculo no es única para cada archivo en el cliente de correo. Uno o más archivos tienen el mismo Uri.

¿Hay alguna forma de obtener el nombre del archivo o la fecha de envío del correo electrónico para que pueda solucionar este problema?

Gracias de antemano.

Respuesta

2

Resolví este problema de forma indirecta.

Identifiqué la exclusividad usando el tamaño del archivo.

En caso si usted necesita el código aquí es

InputStream is = getContentResolver().openInputStream(uri); 
FILE_SIZE=is.available(); 
+1

Quiero buscar la imagen de archivo adjunto de Gmail aplicación a mi aplicación a través de la intención cuota pero no soy capaz de decodificar el URI del archivo como u especificado en post "content: //gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false" Por favor ayuda. –

0

He venido recientemente a través del mismo tema y encontré una manera de obtener el nombre del archivo:

public static String getContentName(ContentResolver resolver, Uri uri){ 
    Cursor cursor = resolver.query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null); 
    cursor.moveToFirst(); 
    int nameIndex = cursor.getColumnIndex(cursor.getColumnNames()[0]); 
    if (nameIndex >= 0) { 
     return cursor.getString(nameIndex); 
    } else { 
     return null; 
    } 
} 

Para usar :

String fileName = getContentName(getContentResolver(), getIntent().getData()); 

Saludos.

7

Como se muestra a continuación, puede hacer una copia local del mismo archivo adjunto y trabajar en ese archivo. Directamente no podrás acceder a ese archivo que está en el servidor de Gmail.

Uri uri = getIntent().getData(); 
    if (uri != null) { 
    try { 
     InputStream attachment = getContentResolver().openInputStream(uri); 
     if (attachment == null) 
      Log.e("GMAIL ATTACHMENT", "Mail attachment failed to resolve"); 
     else { 

      FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
      byte[] buffer = new byte[1024]; 
      while (attachment.read(buffer) > 0) 
       tmp.write(buffer); 
      tmp.close(); 
      attachment.close(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
    return getCacheDir().getPath() + "/temp.myfile"; 

Reember para agregar esto a su manifiesto.

<intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.EDIT" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data 
       android:host="*" 
       android:mimeType="application/octet-stream" 
       android:pathPattern=".*\\.tsconfig" /> 
      <!-- To handle gmail attachments --> 
    </intent-filter> 
0

Gracias Lokesh Kumar, ¡su código ayudó mucho! Sin embargo, me gustaría destacar un problema con su solución.

Al intentar utilizar el código de los suyos:

FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
     byte[] buffer = new byte[1024]; 
     while (attachment.read(buffer) > 0) 
      tmp.write(buffer); 
     tmp.close(); 
     attachment.close(); 

que se copia en todo el archivo, pero creo que hay un problema. Al hacer attachment.read(buffer), está leyendo 1024 bytes cada vez y permite decir que tiene un archivo de 2000 bytes.

En la primera lectura, obtendrá los primeros 1024, luego en la próxima y última lectura, obtendrá los últimos 976 bytes y, por lo que vi, en este caso, el búfer no limpia los últimos bytes de las vistas preliminares leídas, el final del archivo será 976 bytes desde la última lectura, y el resto 48 desde la lectura anterior a la última. Esto hará que el final del archivo sea incorrecto.

En mi caso, el archivo adjunto es un archivo kml (un archivo de datos de ubicación en forma de xml) que tuve que copiar. Al tratar de usar este código siempre obtengo el final del kml incorrecto. después de la etiqueta de cierre, recibí un texto que era de la lectura anterior al último.

Algo como esto:

</Document> 
</kml> 
278 
34.81186031,31.96118044 
34.81184437,31.96122622 
34.81181701,31.96127052 
34.81182701,31.9612875 

Por supuesto, esto no es un kml válida, y provocará errores al intentar pars TI.

Por lo tanto, he usado un código diferente para leer de la secuencia de entrada que mejoró el trabajo.

Este es mi código para copiar el archivo:

InputStream attachment = getContentResolver().openInputStream(container.uri); 
      FileOutputStream tmp = new FileOutputStream(container.fileName); 

      BufferedInputStream bis = new BufferedInputStream(attachment); 
      StringBuffer b = new StringBuffer(); 

      while (bis.available() != 0) { 
       char c = (char) bis.read(); 
       b.append(c); 
      } 

      bis.close(); 
      attachment.close(); 
      tmp.write(String.valueOf(b).getBytes()); 
      tmp.close(); 
Cuestiones relacionadas