2011-02-04 24 views
10

Estoy creando un agregador de rss para mi teléfono Android. Me gustaría poder suscribirme a un RSS desde el navegador, ya que la mayoría de los sitios web tienen un botón de suscribirse a través de RSS.¿Cómo abrir mi aplicación Android cuando el enlace rss se abre en el navegador?

¿Cómo puedo construir un filtro de intención para recibir esos enlaces?

Esta pregunta fue similar y mostró cómo crear un filtro intención de manejar enlaces del navegador: Make a link in the Android browser start up my app?

Sin embargo, no sé cómo hacer que sea específico para los canales RSS. Como un intento Probé este filtro:

 <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <data android:mimeType="application/rss+xml" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
     </intent-filter> 

Estoy en el camino correcto? ¿En qué debería estar filtrando?

+1

Sólo un breve recordatorio: no lo hacen supongamos que la ruta se puede dar como expresión regular solo porque con frecuencia se ve ". *". La sintaxis es muy limitada. Consulte http://developer.android.com/guide/topics/manifest/data-element.html para conocer algunos detalles al respecto. – xmjx

Respuesta

7

Resulta que hay muchas formas diferentes de configurar podcasts, por lo que cada filtro de intención solo funcionará para algunos de ellos. Se necesitan muchos filtros diferentes para obtener el efecto deseado sobre la mayoría de los enlaces de suscripción.

He aquí algunos de los filtros encontré que trabajaron:

<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="itpc" /> 
       <data android:scheme="pcast" /> 
       <data android:scheme="feed" /> 
       <data android:scheme="rss" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*xml" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*rss" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*feed.*" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*podcast.*" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*Podcast.*" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*rss.*" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*RSS.*" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 
       <data android:mimeType="text/xml" android:scheme="http" /> 
       <data android:mimeType="application/rss+xml" android:scheme="http" /> 
       <data android:mimeType="application/atom+xml" android:scheme="http" /> 
      </intent-filter> 
+0

por qué se cierra la aplicación después de obtener la url del sitio web a través de los filtros de intención? Quiero decir en mi aplicación, cuando uso filtro de intención para agregar obtener URL del sitio web, se muestra en la vista de texto pero se cierra y vuelve a la aplicación del navegador desde donde hice clic en el enlace –

3

¿Estoy en el camino correcto?

Sí. Sin embargo:

  • No es necesario el esquema
  • Le falta el prefijo android: frente a scheme, de todos modos
  • type debería ser android:mimeType

Here is a sample application que demuestra, entre otras cosas , respondiendo a enlaces en archivos PDF.

+0

Hice las correcciones pero todavía no puedo hacer que mi aplicación responda a los enlaces – CodeFusionMobile

1

¿Podría ser que el servidor no envíe el tipo mimet correcto?

experimento añadiendo:

<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="http" /> 
    <data android:host="*" /> 
    <data android:pathPattern=".*\\.rss" /> 
    <data android:pathPattern=".*\\.xml" /> 
    </intent-filter> 

Editar: Es un poco complicado para componer el conjunto adecuado de intención de filtros, hay una gran cantidad de los primeros resultados del algoritmo de coincidencia:
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/IntentFilter.java

En su caso, el tipo mimet debe coincidir exactamente con 'application/rss + xml' ¿sus fuentes devuelven ese tipo mimet en el encabezado del mensaje?

URL url = new URL("http://www.engadget.com/rss.xml"); 
    URLConnection conn = url.openConnection(); 
    System.out.println("Content-Type:"+conn.getHeaderField("Content-Type")); 

Trata de:

  1. fabricar filtros más amplios
  2. añadir varios filtros.
+0

Eso tampoco funciona. Además, la mayoría de los feeds hoy en día no usan una extensión .rss o .xml, solo usan alguna URL predeterminada, a veces incluso una página php. – CodeFusionMobile

+0

Están usando tipos de mime, reemplace las líneas de datos con:

19

Estos 3 filtros parecen ser las utilizadas por GoogleListen y GoogleReader aplicaciones:

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <data android:scheme="http"/> 
    <data android:host="*"/> 
    <data android:pathPattern=".*\\.xml"/> 
    <data android:pathPattern=".*\\.rss"/> 
</intent-filter> 

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <data android:scheme="http"/> 
    <data android:host="feeds.feedburner.com"/> 
    <data android:host="feedproxy.google.com"/> 
    <data android:host="feeds2.feedburner.com"/> 
    <data android:host="feedsproxy.google.com"/> 
</intent-filter> 

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <data android:scheme="http"/> 
    <data android:mimeType="text/xml"/> 
    <data android:mimeType="application/rss+xml"/> 
    <data android:mimeType="application/atom+xml"/> 
    <data android:mimeType="application/xml"/> 
</intent-filter> 
+0

Esto me ahorró una hora de prueba. Daría +10 si es posible. Solo por curiosidad: ¿cómo averiguaste qué filtros usa Google Listen y Google Reader? – sven

Cuestiones relacionadas