Abra la aplicación de Android desde la URL usando intent-el filtro no funciona


Tengo una aplicación para Android que la gente usa como reemplazo de un sitio web. Por lo tanto, cuando los usuarios encuentran una URL al sitio web, quiero darles la opción de "abrir la URL" en mi aplicación en lugar de en el navegador. En otras palabras, quiero que aparezca la ventana emergente que les permite elegir entre mi aplicación y el navegador (y posiblemente otras aplicaciones).

Entiendo de varias fuentes que necesito agregar un filtro de intent a una actividad en mi aplicación con el filtro' data ' que filtra en las URL de la forma correcta.

El sitio web en cuestión es http://members.iracing.com , por lo tanto, he añadido el siguiente filtro de intención:

    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:host="members.iracing.com" />
        </intent-filter>
    </activity>

He probado varias formas de estos filtros de datos, como usar un solo nodo 'data' con ambos atributos:

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" android:host="members.iracing.com"/>
        </intent-filter>

Simplemente no está funcionando. No se que más decirte. Alojé una página HTML simple en mi sitio web con un par de enlaces a varias páginas en ese sitio web (todos comenzando con "http://members.iracing.com/...") y cuando haga clic en cualquiera de ellos, simplemente se abren en el navegador sin preguntarme qué aplicación quiero usar. Lo probé tanto en el emulador como después de instalar la aplicación en mi dispositivo físico, nada funciona. Probé esto en un completamente en BLANCO, nuevo proyecto de Android solo para ver si eso funcionaría, nada.

Luego me di cuenta de que el sitio web requiere autenticación, y si no está conectado, redirige a la página de inicio de sesión en https://members.iracing.com/membersite/login.jsp , por lo tanto, intenté reemplazar el esquema por "https". Incluso intenté cambiar el anfitrión a "www.members.iracing.com", y al final incluso intenté una combinación de todas estas cosas (no estoy seguro de si esto debería funcionar, pero bueno, estoy desesperado en este punto.....)

       <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="members.iracing.com" />
            <data android:host="www.members.iracing.com" />
        </intent-filter>

Todavía no va. Sin embargo, no estoy seguro de si la redirección es relevante, el navegador claramente primero va al sitio no redirigido, luego redirige a la página de inicio de sesión, pero en ningún momento tengo la opción de abrirlo en mi aplicación. Además, si Inicio sesión manualmente en el navegador primero, no hay redirección, y todavía no funciona.

¿Me estoy perdiendo algo obvio aquí? Me estoy tirando del pelo por qué esto no funciona, y no puedo depurarlo además de probar todas las combinaciones posibles que se me ocurran (lo hice...). Gracias por cualquier ayuda!

Author: Nick Thissen, 2012-11-08

3 answers

Use estos tres en su <intent filter>

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
 32
Author: Anuj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 13:31:52

Pensé que publicaría esto aquí ya que pasé algún tiempo investigando por qué mi filtro de intención no funcionaba. Resulta que estaba funcionando todo el tiempo, pero los partidos son exactos. Por lo tanto, si registra su intención para http://myexample.com y haces clic en http://myexample.com/blah no funcionará.

Al agregar lo siguiente se solucionó el problema:

<data android:pathPattern="/.*" />

Así que el filtro de intent se ve como:

<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:host="example.com" />
            <data android:scheme="https" />
            <data android:pathPattern="/.*" />
</intent-filter>
 57
Author: nurieta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 06:29:28

@nurieta, tu respuesta hizo el truco para mí gracias!

Una palabra de consejo ya que estoy tratando con cadenas de consulta potenciales, lo manejé a través de un poco de código en el .java con el fin de determinar si se acaba de abrir la aplicación o para enviarle a una ubicación específica en la aplicación. Mi aplicación es solo una vista web que ejecuta una aplicación móvil jQuery.

    if(getIntent().getData()!=null){//check if intent is not null
        Uri data = getIntent().getData();//set a variable for the Intent
        String scheme = data.getScheme();//get the scheme (http,https)
        String fullPath = data.getEncodedSchemeSpecificPart();//get the full path -scheme - fragments

        combine = scheme+"://"+fullPath; //combine to get a full URI
    }

    String url = null;//declare variable to hold final URL
    if(combine!=null){//if combine variable is not empty then navigate to that full path
        url = combine;
    }
    else{//else open main page
        url = "http://www.example.com";
    }
    webView.load(url);
 10
Author: user2004796,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-13 20:35:38