Haz un enlace en el navegador de Android para iniciar mi aplicación?

¿Es posible hacer un enlace como:

<a href="anton://useful_info_for_anton_app">click me!</a> 

Hacer que mi aplicación Anton para arrancar?

Sé que esto funciona para la aplicación de Android Market con el protocolo de mercado, pero se puede hacer algo similar con otras aplicaciones?

Aquí hay un ejemplo de un enlace que iniciará el Android Market:

 <a href="market://search?q=pname:com.nytimes.android">click me!</a> 

Actualización: La respuesta que acepté proporcionada por eldarerathis funciona muy bien, pero sólo quiero mencionar que tuve algunos problemas con el orden de los subelementos de la etiqueta <intent-filter> . Te sugiero que simplemente hagas otro <intent-filter> con los nuevos subelementos de esa etiqueta para evitar los problemas que tuve. Por ejemplo mi AndroidManifest.xml parece a esto:

 <activity android:name=".AntonWorld" 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> <data android:scheme="anton" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Creo que querrás ver el elemento <intent-filter> de tu archivo de Mainfest. Concretamente, eche un vistazo a la documentación del subelemento <data> .

Básicamente, lo que tendrás que hacer es definir tu propio esquema. Algo en la línea de:

 <intent-filter> <data android:scheme="anton" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed ... </intent-filter> 

Entonces deberías poder lanzar tu aplicación con enlaces que comienzan con el esquema anton: URI.

¡No utilice por favor su propio esquema de encargo como eso !!! Los esquemas URI son un espacio de nombres global de red. ¿Posees el esquema "anton:" en todo el mundo? ¿No? Entonces NO lo use.

Una opción es tener un sitio web y tener un filtro de intenciones para un URI en particular en ese sitio web. Por ejemplo, esto es lo que hace el mercado para interceptar URIs en su sitio web:

  <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="market.android.com" android:path="/search" /> </intent-filter> 

Alternativamente, existe el esquema de "intención:". Esto le permite describir casi cualquier Intent como un URI, que el navegador intentará lanzar al hacer clic. Para construir un esquema de este tipo, la mejor manera es simplemente escribir el código para construir el Intent que desea lanzar, y luego imprimir el resultado de intent.toUri (Intent.URI_INTENT_SCHEME).

Puede usar una acción con esta intención para encontrar cualquier actividad que apoye esa acción. El navegador agregará automáticamente la categoría BROWSABLE a la intención antes de lanzarla, por razones de seguridad; También quitará cualquier componente explícito que haya suministrado por la misma razón.

La mejor manera de utilizar esto, si desea asegurarse de que sólo inicia su aplicación, es con su propia acción de ámbito y utilizando Intent.setPackage () para decir que el Intent solo coincidirá con el paquete de la aplicación.

Intercambios entre los dos:

  • Http URIs requieren que usted tiene un dominio que posee. El usuario siempre tendrá la opción de mostrar el URI en el navegador. Tiene muy buenas propiedades de repliegue donde si su aplicación no está instalada, simplemente aterrizará en su sitio web.

  • Los URI de intenciones requieren que su aplicación ya esté instalada y solo en teléfonos Android. El permitir casi cualquier intención (pero siempre tienen la categoría de BROWSABLE incluida y no apoyar componentes explícitos). Te permiten dirigir el lanzamiento solo a tu aplicación sin que el usuario tenga la opción de ir al navegador o cualquier otra aplicación.

También me enfrenté a este problema y ver muchas páginas absurdas. He aprendido que para hacer su aplicación navegable, cambiar el orden de los elementos XML, esto es lo siguiente:

 <activity android:name="com.example.MianActivityName" android:label="@string/title_activity_launcher"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <data android:scheme="http" /> <!-- or you can use deep linking like --> <data android:scheme="http" android:host="xyz.abc.com"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> 

Esto funcionó para mí y podría ayudarle.

Me disculpo por promocionarme, pero tengo un complemento jQuery para lanzar aplicaciones nativas desde los enlaces web https://github.com/eusonlito/jquery.applink

Usted puede utilizarlo fácil:

 <script> $('a[data-applink]').applink(); </script> <a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a> 

Una vez que tengas la intención y el esquema de url personalizado para la configuración de tu aplicación, este código javascript en la parte superior de una página de recepción ha funcionado para mí en iOS y Android:

 <script type="text/javascript"> // if iPod / iPhone, display install app prompt if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) || navigator.userAgent.match(/android/i)) { var store_loc = "itms://itunes.com/apps/raditaz"; var href = "/iphone/"; var is_android = false; if (navigator.userAgent.match(/android/i)) { store_loc = "https://play.google.com/store/apps/details?id=com.raditaz"; href = "/android/"; is_android = true; } if (location.hash) { var app_loc = "raditaz://" + location.hash.substring(2); if (is_android) { var w = null; try { w = window.open(app_loc, '_blank'); } catch (e) { // no exception } if (w) { window.close(); } else { window.location = store_loc; } } else { var loadDateTime = new Date(); window.setTimeout(function() { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime < 5000) { window.location = store_loc; } else { window.close(); } }, 25); window.location = app_loc; } } else { location.href = href; } } </script> 

Esto sólo se ha probado en el navegador de Android. No estoy seguro acerca de Firefox o Opera. La clave es que aunque el navegador de Android no lance una excepción agradable para usted en window.open(custom_url, '_blank') , fallará y devolverá null que puede probar más tarde.

Actualización: utilizando store_loc = "https://play.google.com/store/apps/details?id=com.raditaz"; Para vincular a Google Play en Android.

Aquí está mi receta:

Cree un HTML estático que redirija a la URL de la aplicación solicitada, coloque esa página en la Web.

De esta forma, los enlaces que compartes son enlaces "reales" en lo que a Android se refiere (serán "clicables").

Usted "comparte" un enlace HTTP normal, http://www.your.server.com/foo/bar.html Esta URL devuelve un simple HTML de 8 líneas que redirige al URI de su aplicación (window.location = "blah: // kuku") ( Tenga en cuenta que 'blah' no tiene que ser HTTP o HTTPS más).

Una vez que usted consigue esto en marcha, puede aumentar el HTML con todas las capacidades de fantasía como se sugirió anteriormente.

Esto funciona con el navegador incorporado, Opera y Firefox (no han probado ningún otro navegador). Firefox pregunta 'Este enlace necesita ser abierto con una aplicación' (ok, cancelar). Aparentemente, otros navegadores no se preocupan tanto por la seguridad, simplemente abren la aplicación, sin hacer preguntas.

Es posible que desee considerar una biblioteca para manejar el enlace profundo a su aplicación:

https://github.com/airbnb/DeepLinkDispatch

Puede agregar el filtro de intenciones en una actividad anotada como las personas sugeridas anteriormente. Se encargará del enrutamiento y análisis de parámetros para todos sus vínculos profundos. Por ejemplo, su MainActivity podría tener algo como esto:

 @DeepLink("somePath/{useful_info_for_anton_app}") public class MainActivity extends Activity { ... } 

También puede manejar los parámetros de consulta también.

Prueba mi truco simple:

  public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.startsWith("classRegister:")) { Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister); } view.loadUrl(url); return true; } 

Y mi enlace html:

 <a href="classRegister:true">Go to register.java</a> 

O puede hacer <a href = "classRegister: true"> <- "true" valor para class filename

Sin embargo este trabajo de la escritura para el acoplamiento del mailto 🙂

  if (url.startsWith("mailto:")) { String[] blah_email = url.split(":"); Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("text/plain"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)"); Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be); startActivity(emailIntent); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.