2011-06-10 13 views
6

Actualmente trabajo en una aplicación de Android que lee archivos con una extensión personalizada. Una de las características obligatorias, es que la aplicación debe ser propuesta por gmail cuando el usuario recibe un correo con el archivo adjunto .ourextension.Adjunto de Gmail y extensión personalizada

Investigué un poco y encontré que el cliente de gmail en Android no depende de la extensión, porque en los datos del intento lanzado el archivo propuesto no tiene extensión. Solo se basa en el tipo de mimo proporcionado por el cliente de correo.

El problema es que nuestro archivo personalizado no se detecta de la misma manera entre los clientes de correo. Por ejemplo, si me envío a mí mismo con la página web de Gmail nuestro archivo personalizado, el tipo MIME se detecta como application/octet-stream. Si un amigo mío lo envía con el software de escritorio Apple Mail, se detecta como un texto/xml (lo que sería bueno). Y en otro cliente de correo, Evolution, el tipo mime es text/plain ...

¡Nuestra aplicación no puede manejar todos esos tipos! De lo contrario, se propondría para cada tipo de accesorio ...

¿Hay alguna solución para esto?

Respuesta

0

Editar: Esta respuesta tiene 3 años. No tuve tiempo de probar las respuestas del otro, pero el mío está claramente desactualizado, así que, por favor, busque las respuestas de los demás sobre este tema.

No encontré ninguna solución, la única manera de trabajar es con mime-type, por lo que debe rezar para que su archivo adjunto sea reconocido con un tipo de mime conocido, y manejar esto. Significa que interferirás con otra aplicación, si tu archivo se reconoce como html, por ejemplo.

Debe manejar el caso de que su aplicación no pueda leer un archivo y mostrar una ventana emergente para notificar al usuario que no puede leer el archivo.

Tal vez en un año o dos, Gmail proporcionará una buena API ...

Por cierto, la última versión de Gmail añadir un botón de descarga que debe manejar para evitar accidentes, funciona mediante la creación de una nueva archivo con el uri.

0

Todavía se puede coincidir con la extensión de Gmail

<intent-filter> 
<action android:name="android.intent.action.VIEW" /> 
<category android:name="android.intent.category.DEFAULT" /> 
<data android:mimeType="application/*" host="*" android:pathPattern=".*\\.mht" android:scheme="content" /> 
</intent-filter> 

Hacer el cambio de tipo de MIME para ser / y itll única coincidir en la extensión

+0

Disculpa, no he visto tu respuesta antes, intentaré lo antes posible si funciona, y edito mi respuesta si es así. – NitroG42

+0

Lo sentimos, pero no funciona, Gmail solo usa el tipo mime para la intención. – NitroG42

+0

Funciona para mí. Tengo un botón de descarga y vista previa. Probado en un teléfono Galaxy S y una tableta Galaxy S II. –

2

Es posible conseguir que esto funcione de Gmail, aunque Me está costando días de esfuerzo resolver todos los problemas.

Los datos importantes Intención

act=android.intent.action.VIEW 
dat=file:///mnt/sdcard/Download/Availability Focus.inform 
typ=application/octet-stream 
flg=0x80001 cmp=air.com.extension/.AppEntry 

El filtro de Intención que fue capaz de capturarlo (algunas notas abajo)

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:scheme="file" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/> 
    <data android:scheme="content" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/> 
    </intent-filter> 

tanto el contenido como archivo de esquema se requieren. Sin el esquema de CONTENIDO, gmail ignorará su filtro todos juntos. Esto parece un error. Sin el esquema de ARCHIVOS, gmail arrojará un error al decir que no sabe qué aplicación lanzar desde la intención.

07-19 15:38:19.160: ERROR/Gmail(2220): Coun't find Activity for intent 

Con ambos esquemas en su lugar, la aplicación recibe la intención de los archivos descargados y preescritos. Deben manejarse de manera diferente.

+0

Acabo de probar esto, y funciona para Gmail 4.1.2 que se ejecuta en Android 4.0.3. Pero cuando abro el mismo correo electrónico con Gmail 2.3.6 ejecutándose en Android 2.3.6, ni siquiera tengo la opción de abrir el archivo adjunto. –

+0

Probado con Gmail 4.2.1 ejecutándose en Android 4.2. Funciona bien. Gracias. – Medo

+3

Al probar esto, asegúrese también de intentar abrir un archivo adjunto con una extensión diferente, que aún no tenga una asociación. Descubrirá que su 'intento-filtro' también lo iguala. La razón, creo, es que no tiene un atributo 'host', y sin eso se ignora' pathPattern' (developer.android.com/guide/topics/manifest/data-element.html). Si agrega 'android: host =" * "' entonces su 'intento-filtro' de repente ya no coincidirá. El problema parece ser que los URI 'content: //' no contienen el nombre de archivo (developer.android.com/reference/android/content/ContentUris.html). –

3

Solución para abrir archivo con extensión personalizada probado con Gmail < 4.2, Gmail 4.2, Google Drive y explorador de archivos

código para enviar archivo:

sendIntent.setType("application/calc1"); 

Intención-filtro:

  <!-- Filter to open file with gmail version < 4.2 --> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

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

      <data android:mimeType="application/calc1" /> 
      <data android:pathPattern=".*\\.calc1" /> 
      <data android:host="*" /> 
     </intent-filter> 

     <!-- Filter to open with file browser or google drive --> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

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

      <data android:scheme="file" /> 
      <data android:mimeType="*/*" /> 
      <data android:pathPattern=".*\\.calc1" /> 
      <data android:host="*" /> 
     </intent-filter> 

     <!-- Filter to open file with gmail version 4.2 --> 
     <!-- Save file first with "save" button otherwise gmail crashes --> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

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

      <data android:mimeType="application/octet-stream" /> 
      <data android:pathPattern=".*\\.calc1" /> 
      <data android:host="*" /> 
     </intent-filter> 
Cuestiones relacionadas