2010-06-02 19 views

Respuesta

576

Usa un <intent-filter> con un elemento <data>. Por ejemplo, para manejar todos los enlaces a twitter.com, que había puesto esta dentro de su <activity> en su AndroidManifest.xml:

<intent-filter> 
    <data android:scheme="http" android:host="twitter.com"/> 
    <action android:name="android.intent.action.VIEW" /> 
</intent-filter> 

Entonces, cuando el usuario hace clic en un enlace a Twitter en el navegador, se les pedirá qué aplicación usar para completar la acción: el navegador o su aplicación.

Por supuesto, si se desea proporcionar una estrecha integración entre su sitio web y su aplicación, puede definir su propio esquema:

<intent-filter> 
    <data android:scheme="my.special.scheme" /> 
    <action android:name="android.intent.action.VIEW" /> 
</intent-filter> 

Luego, en su aplicación web se puede poner enlaces como:

<a href="my.special.scheme://other/parameters/here"> 

Y cuando el usuario hace clic en él, su aplicación se iniciará automáticamente (porque es probable que sea el único que pueda manejar el tipo de uris my.special.scheme://). El único inconveniente de esto es que si el usuario no tiene la aplicación instalada, obtendrá un error desagradable. Y no estoy seguro de que haya alguna manera de verificarlo.


Editar: Para responder a su pregunta, puede utilizar getIntent().getData() que devuelve un objeto Uri. A continuación, puede utilizar los métodos Uri.* para extraer los datos que necesita. Por ejemplo, digamos que el usuario ha hecho clic en un enlace para http://twitter.com/status/1234:

Uri data = getIntent().getData(); 
String scheme = data.getScheme(); // "http" 
String host = data.getHost(); // "twitter.com" 
List<String> params = data.getPathSegments(); 
String first = params.get(0); // "status" 
String second = params.get(1); // "1234" 

Usted puede hacer lo anterior en cualquier lugar en su Activity, pero lo que probablemente va a querer hacerlo en onCreate(). También puede usar params.size() para obtener el número de segmentos de ruta en el Uri. Consulte javadoc o el sitio web del desarrollador de Android para conocer otros métodos Uri que puede usar para extraer partes específicas.

+5

Gracias por su pronta respuesta. Pero, ¿pueden decirme cómo acceder a los parámetros después de "my.special.scheme: //"? –

+4

He editado mi respuesta para incluir instrucciones sobre cómo extraer los datos del Uri. Marque esta respuesta como aceptada (solo) si lo considera así haciendo clic en la marca de verificación junto a ella. – Felix

+0

Muy impresionante muy útil. – Anton

0

Hola, tengo la solución. No configuré la categoría como "Predeterminado". También estaba usando la actividad principal para los datos de intención. Ahora estoy usando una actividad diferente para los datos de intención. Gracias por la ayuda. :)

+0

Suena poco probable (aunque reconozco que esta es una vieja pregunta y tal vez las cosas han cambiado.) De http://developer.android.com/guid e/components/intents-filters.html # ifs "Para intentar pasar la prueba de categoría, cada categoría del objeto Intent * debe coincidir con una categoría del * filtro *. El filtro puede enumerar categorías adicionales, pero no puede omitir ninguna que esté en el intento. " –

0

Debe agregar un pseudo-nombre de host a CALLBACK_URL 'aplicación: //' no tiene sentido como una URL y no se puede analizar.

16

También debe haber <category android:name="android.intent.category.BROWSABLE"/> agregado al filtro de intención para que la actividad se reconozca correctamente desde el enlace.

+3

Como referencia, agregar CATEGORY_BROWSABLE significa que" La actividad de destino puede ser invocada de manera segura por el navegador para mostrar los datos a los que hace referencia un enlace, por ejemplo, un imagen o un mensaje de correo electrónico. " – greg7gkb

+0

¿Es esta una categoría existente o está proponiendo una nueva? – Anish

+0

Existe. Aparentemente debe tener un host de sitio web por separado en diferentes etiquetas de filtro de intención, o causa problemas. – NoBugs

64

Por favor, vea mi comentario aquí: Make a link in the Android browser start up my app?

Nos oponemos enérgicamente a la gente use sus propios esquemas, a menos que se están definiendo un nuevo esquema de Internet en todo el mundo.

+9

Hackbod es uno de los ingenieros de Google detrás de la plataforma Android. Probablemente sea una buena idea seguir este consejo. De hecho, parece que el esquema de soporte personalizado como este se rompió en Honeycomb. – nmr

+1

Creo que debe crear su propio esquema si desea que la URL también funcione en iPhone (por ejemplo, desde un código QR). –

+23

No me hago responsable de las limitaciones impuestas a los desarrolladores por iOS. ;) – hackbod

47

En mi caso tuve que establecer dos categorías para el <intent-filter> y luego funcionó:

<intent-filter> 
<data android:scheme="my.special.scheme" /> 
<action android:name="android.intent.action.VIEW" /> 
<category android:name="android.intent.category.DEFAULT"/> 
<category android:name="android.intent.category.BROWSABLE"/> 
</intent-filter> 
+2

Lo mismo aquí, necesario para agregar la categoría adicional. – KPK

+0

¿Alguien puede explicar cuál es el proceso real de hacer esto? Cualquier enlace a la implementación exacta, los requisitos previos serán útiles. Gracias –

+0

Probado en la configuración del desarrollador. En realidad, estaba dando un nombre de dominio incorrecto. Mi error. –

8

El siguiente enlace proporciona información sobre el lanzamiento de la aplicación (si está instalada) directamente desde el navegador.De lo contrario, abre directamente la aplicación en Play Store para que el usuario pueda descargar sin problemas.

https://developer.chrome.com/multidevice/android/intents

62

Todas las respuestas anteriores no funcionaron para mí con CHROME al 28 Ene 2014

mi aplicación ejecutados correctamente desde http://example.com/someresource/ enlaces de aplicaciones como Hangouts, Gmail, etc, pero no desde el navegador Chrome.

para resolver esto, por lo que se pone en marcha correctamente desde Chrome tiene que configurar el filtro intención como esta nota

 <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" 
       android:pathPrefix="/someresource/" 
       android:scheme="http" /> 
      <data 
       android:host="www.example.com" 
       android:pathPrefix="/someresource/" 
       android:scheme="http" /> 
     </intent-filter> 

el elemento pathPrefix

su aplicación va a aparecer dentro de la actividad selector cuando el usuario solicita http://example.com/someresource/ patrón del navegador Chrome haciendo clic en un enlace de los resultados de búsqueda de Google o cualquier otro sitio web

+0

Esto me ayudó mucho. ¡Muchas gracias! Por favor, publique su respuesta aquí para que pueda otorgarle la recompensa! http://stackoverflow.com/questions/21663001/launching-custom-android-application-from-android-browser-chrome –

+0

@VladSchnakovszki thx, there u go :) – AndroidGecko

+0

¿Qué idioma es este? – Dims

6

Tenga en cuenta que si su ícono desaparece de android launcher cuando implementa esta característica, entonces debe dividir intent-filter.

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <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" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="your-own-uri" /> 
     </intent-filter> 
    </activity> 
+2

¿Cómo hacer que esto funcione para Android lollipop? – Salmaan

+1

Acabas de salvarme la vida, señor @szines. Gracias. – user1801879

+1

Esto no parece funcionar en lollipop – portfoliobuilder

0

ejemplo.php: enfoque

<?php 
if(!isset($_GET['app_link'])){ ?> 
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe> 
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe> 
    <?php 
} 
else { ?> 
    <script type="text/javascript"> 
    self.window.location  = '<?php echo $_GET['app_link'];?>'; 
    window.parent.location.href = '<?php echo $_GET['full_link'];?>'; 
    </script> 
<?php 
} 
+5

¿Puede explicar lo que se supone que debe hacer este código? –

+1

Esto crea dos iframes invisibles: enlace profundo y enlace normal. Si la aplicación está instalada, el iframe de enlace profundo la lanzará. Si no, se muestra el enlace normal. Con un poco de trabajo adicional, se podría implementar el enlace profundo diferido donde se invoca el enlace profundo después de que se instala la aplicación. –

3

de Felix para el manejo de enlaces profundos es el típico enfoque de manejo de enlaces profundos. También me sugiero revisar esta biblioteca para manejar el enrutamiento y el análisis de sus enlaces profundos:

https://github.com/airbnb/DeepLinkDispatch

Puede utilizar las anotaciones para registrar su actividad por un profundo vínculo específico URI, y se va a extraer los parámetros para usted sin tener que hacer el galimatías usual de conseguir los segmentos de trazado, se pongan en venta, etc usted puede simplemente anotar y actividad como esta:

@DeepLink("somePath/{someParameter1}/{someParameter2}") 
public class MainActivity extends Activity { 
    ... 
} 
+0

Esta es la mejor manera de hacerlo. – muntasir2000

16

por ejemplo, usted tiene las cosas siguientes:

un vínculo para abrir su aplicación: http://example.com

El nombre del paquete de la aplicación: com.example.mypackage

Luego hay que hacer a continuación:

1) añadir un filtro de intención a su actividad (puede ser cualquier actividad que desee). Para obtener más información, consulte el documentation).

 <activity 
     android:name=".MainActivity"> 

     <intent-filter android:label="@string/filter_title_view_app_from_web"> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <!-- Accepts URIs that begin with "http://example.com" --> 

      <data 
       android:host="example.com" 
       android:scheme="http" /> 
     </intent-filter> 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

    </activity> 

2) Crear un archivo HTML para probar el enlace o utilizar this methods.

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a> 

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a> 

3) Uso móvil Chrome para probar

4) Eso es todo.

Y no es necesario publicar aplicaciones en el mercado para probar los enlaces profundos =)

Además, para más información, consulte documentation y útil presentation.

+0

Tuve que crear un archivo html y subirlo para que funcione. Me pregunto por qué, especialmente el segundo, no funciona directamente desde un navegador (Chrome). – Makalele

Cuestiones relacionadas