pie - android versiones
¿Hacer un enlace en el navegador de Android iniciar mi aplicación? (8)
Aquí está mi receta:
Cree un HTML estático que redirija a la URL de la aplicación solicitada, ponga esa página en la web.
De esa manera, los enlaces que compartes son enlaces "reales" en lo que respecta a Android (serán "clicables").
Usted ''comparte'' un enlace HTTP regular, www.your.server.com/foo/bar.html. Esta URL devuelve un HTML simple de 8 líneas que redirige al URI de su aplicación (window.location = "blah: // kuku") ( tenga en cuenta que ''blah'' ya no tiene que ser HTTP o HTTPS).
Una vez que lo haya puesto en funcionamiento, puede aumentar el HTML con todas las capacidades sofisticadas que se sugieren anteriormente.
Esto funciona con el navegador integrado, Opera y Firefox (no he probado ningún otro navegador). Firefox pregunta ''Este enlace debe abrirse con una aplicación'' (ok, cancelar). Aparentemente, otros navegadores no se preocupan demasiado por la seguridad, simplemente abren la aplicación, sin hacer preguntas.
¿Es posible hacer un enlace como:
<a href="anton://useful_info_for_anton_app">click me!</a>
hacer que mi aplicación Anton se inicie?
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á 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 solo quiero mencionar que tuve algunos problemas con el orden de los subelementos de la etiqueta <intent-filter>
. Le sugiero que simplemente haga otro <intent-filter>
con los nuevos subelementos en esa etiqueta para evitar los problemas que tuve. Por ejemplo, mi AndroidManifest.xml
ve así:
<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á ver el elemento <intent-filter>
de su archivo Mainfest. Específicamente, eche un vistazo a la documentación para el subelemento <data>
.
Básicamente, lo que necesitas hacer es definir tu propio esquema. Algo a lo largo de las líneas 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 iniciar tu aplicación con enlaces que comiencen con el esquema anton:
URI.
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 intención en una Actividad anotada como las personas sugeridas anteriormente. Manejará el enrutamiento y el análisis de parámetros para todos sus enlaces 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.
Pido disculpas por promocionarme, pero tengo un complemento de jQuery para lanzar aplicaciones nativas desde enlaces web https://github.com/eusonlito/jquery.applink
Puedes usarlo facilmente:
<script>
$(''a[data-applink]'').applink();
</script>
<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>
Por favor, ¡NO uses tu propio esquema personalizado como ese! Los esquemas URI son un espacio de nombres global de red. ¿Eres dueño del esquema "anton:" en todo el mundo? ¿No? Entonces NO lo uses.
Una opción es tener un sitio web y tener un filtro de intención para un URI particular en ese sitio web. Por ejemplo, esto es lo que hace Market para interceptar URI 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 "intención:". Esto le permite describir casi cualquier Intención como un URI, que el navegador intentará iniciar cuando se haga clic. Para crear 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 este propósito para encontrar cualquier actividad que apoye esa acción. El navegador agregará automáticamente la categoría BROWSABLE a la intención antes de lanzarlo, por razones de seguridad; También eliminará cualquier componente explícito que haya suministrado por el mismo motivo.
La mejor forma de usar esto, si quiere asegurarse de que solo se inicie su aplicación, es con su propia acción de alcance y utilizando Intent.setPackage () para decir que la intención solo coincidirá con su paquete de aplicaciones.
Compensaciones entre los dos:
Los URI de http requieren que tengas un dominio propio. El usuario siempre tendrá la opción de mostrar el URI en el navegador. Tiene propiedades de recuperación muy agradables donde, si su aplicación no está instalada, simplemente aterrizarán en su sitio web.
Los URI de intenciones requieren que su aplicación ya esté instalada y solo en los teléfonos Android. El permite casi cualquier intento (pero siempre tiene la categoría EXTRAÍBLE incluida y no admite componentes explícitos). Le permiten dirigir el inicio solo a su aplicación sin que el usuario tenga la opción de ir al navegador o cualquier otra aplicación.
Prueba mi simple truco:
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 que <a href = "classRegister: true"> <- "true" para el nombre de archivo de la clase
Sin embargo, este script funciona para el enlace 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);
}
También me enfrenté a este problema y veo muchas páginas absurdas. Aprendí que para hacer que su aplicación sea navegable, cambie el orden de los elementos XML, esto:
<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 ayudarte.
Una vez que tenga la intención y el esquema de url personalizado para la configuración de su aplicación, este código javascript en la parte superior de una página de recepción me ha funcionado tanto en iOS como en 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 solo ha sido probado en el navegador de Android. No estoy seguro de Firefox u Opera. La clave es que aunque el navegador de Android no arrojará una buena excepción para usted en window.open(custom_url, ''_blank'')
, fallará y devolverá un null
que puede probar más tarde.
Actualización: utilizando store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
para enlazar a Google Play en Android.