2011-07-31 51 views
31

Estoy buscando una forma de averiguar si una aplicación específica está instalada desde un navegador web del lado del cliente. La plataforma es Android.Detectar desde el navegador si hay una aplicación específica instalada en Android

Por ejemplo, escribo mi propio sitio web y escribo mi propia aplicación, ahora quiero cuando el usuario acceda a mi propio sitio desde el navegador del teléfono Android. El navegador mira si la aplicación ya está instalada en el teléfono y si no sugiere la instalación de la aplicación. Puedo hacer eso ?

Respuesta

16

¿Quiere decir que JavaScript se ejecuta en el navegador? Creo (esperanza) que es imposible. No me gustaría que ningún sitio web al azar pueda ver qué aplicaciones están instaladas.

Si desea que el usuario instale una aplicación en particular, puede proporcionar un enlace de mercado en su sitio web: http://developer.android.com/guide/publishing/publishing.html#marketintent

Editar: Después de la aclaración en los comentarios a mi respuesta, una respuesta más útil apareció más adelante, que legítimamente tiene más votos positivos.

+0

Sí, quiero decir desde Javascript. –

+1

@Thomas realmente no hay forma de saber si la aplicación está instalada? Por ejemplo, escribo mi propio sitio web y escribo mi propia aplicación, ahora quiero que cuando el usuario acceda a mi propio sitio desde el navegador del teléfono Android, busque en el navegador si la aplicación está instalada en el teléfono y si no sugiere que instale la aplicación. Puedo hacer eso ? –

+0

Lo edité en la pregunta principal, porque es bastante importante. – Thomas

98

Hay una manera de lograr esto.

No se puede detectar si una aplicación en particular está instalada, por razones de seguridad y privacidad. Pero puede hacer un truco para abrir la aplicación si está instalada o abrir su página de Google Play si no lo está.

Para hacer eso, debe crear un filtro de intención en la actividad principal de su aplicación, para abrirlo cuando se llame a una URL determinada. De esta manera:

<activity android:name=".MainActivity > 
     <intent-filter> 
      <data 
       android:host="www.myurl.com" 
       android:pathPrefix="/openmyapp" 
       android:scheme="http" > 
      </data> 

      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Explicación: cuando el usuario navega a http://www.myurl.com/openmyapp, si se ha instalado la aplicación, se creará una intención y se mostrará la actividad.

¿Pero y si el usuario no tiene la aplicación instalada? Luego debe crear una página de redirección en su http://www.myurl.com/openmyapp/index.html. Cuando el usuario llegue a esta dirección, su servidor debe redireccionar al market://details?id=com.your.app.package.

De esta manera, cuando no se crea una intención después de que el usuario navega a http://www.myurl.com/openmyapp, el servidor web llamará a otra URL. Esa URL, a su vez, abrirá Google Play en el dispositivo, directamente en la página de la aplicación.

Espero que ayude.

+1

es una idea muy interesante, sin embargo, cuando se hace clic en el enlace al intento, se le presenta al usuario un cuadro de diálogo para elegir entre el navegador y la aplicación, ¿hay alguna forma de evitarlo? – hexblot

+1

Buena llamada. El usuario debe elegir la aplicación y luego seleccionar "siempre" para que el filtro de intención funcione la primera vez. La próxima vez, Android ya no preguntará más. Este es el comportamiento predeterminado de Android. Lo mismo ocurre cuando hace clic en un enlace de mapa, por ejemplo. Lamentablemente, no conozco ninguna forma de eludir esto, y dudo que haya uno ... – leocadiotine

+12

@leocadiotine Creo que hay una forma de eludir la "aplicación de elegir" con la directriz en Chrome of Google (https://developers.google .com/chrome/mobile/docs/intents). En resumen, un enlace con dicho formato debe llamarse desde el navegador ** Force open by package_name app **. La aplicación con el nombre del paquete como se busca y abre; de ​​lo contrario, se reenvía al resultado de búsqueda de GooglePlay. – Nezneika

14

He encontrado una solución más útil. A continuación se muestra el archivo de configuración androide:

<activity android:name="me.test.html.MainActivity" > 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 

     <data 
      android:host="xxxxx" 
      android:scheme="mm" /> 
    </intent-filter> 
</activity> 

A continuación se muestra el código html:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
<script type="text/javascript"> 
function test2(){ 
    var di = document.getElementById("di"); 
    di.innerHTML = "app have not installed"; 
} 
function newOpen(){//184 064 323 438 
    var di = document.getElementById("di"); 
    di.innerHTML = "app have installed"; 
    var ifc = document.getElementById("ifc"); 
    ifc.innerHTML = "<iframe src='mm://xxxxx?a=b&c=d' onload='test2()'></iframe>"; 
    return false; 
} 
</script> 
</head> 
<body> 
<a href="#" onclick="return newOpen()">local3</a><br/> 
<div id="di"></div> 
<div style="display:none;" id="ifc"></div> 
</body> 
</html> 

De esta manera, cuando el usuario hace clic en la etiqueta, y si el dispositivo tiene la aplicación instalada, entonces se no muestra un cuadro de diálogo para permitir que el usuario elija, sino que abre la aplicación directamente; y si la aplicación no se ha instalado, se llamará a la función js "test2", por lo tanto, sabemos que la aplicación no se ha instalado, por lo que podemos hacer cualquier cosa en la "prueba2". El beneficio es que no necesitamos usar el esquema html estándar, que mostraría un diálogo de selección, y si utilizo el esquema definido yo mismo, ¡la página no se habría navegado a una página incorrecta! Soy chino, mi inglés no es bueno, espero que todos puedan entenderme y que otros sepan la resolución.

+1

Si la aplicación no está instalada, entonces la aplicación instalada se está mostrando en la pantalla, de lo contrario funciona ... –

+0

Haciendo que la aplicación se instale cuando la aplicación no esté realmente instalada. –

5

Puede hacer uso de Android Intents. Puede construir un ancla de intento para iniciar la aplicación.Si la aplicación no está instalada, el navegador busca el nombre del paquete especificado en el anclaje de intento. También podemos proporcionar una URL Fall Back.

ejemplo:

<a href="intent://scan/#Intent;scheme=zxing package=com.google.zxing.client.android;end"> Take a QR code </a> 

Este no es compatible con todos los navegadores. Chrome y algunos otros navegadores principales lo admiten. Compruebe esto link para más detalles.

Sé que esto es tarde pensó que podría ayudar a alguien.

1

Esto podría estar disponible pronto públicamente.

cromo equipo dice:

En Chrome 59 Estamos introduciendo una nueva API denominada getInstalledRelatedApps(). Esta nueva API te permite determinar si tu aplicación nativa está instalada en un dispositivo. (https://developers.google.com/web/updates/2017/04/getinstalledrelatedapps)

embargo:

Nota: Esta API está detrás de una prueba de origen, esto significa que estamos en un modo experimental y estamos buscando activamente para la retroalimentación. Tiene que optar por su sitio en esta versión de prueba (https://github.com/jpchase/OriginTrials/blob/gh-pages/developer-guide.md) porque no está disponible ampliamente en la web. Ahora puede suscribirse para la versión de prueba (https://docs.google.com/forms/d/e/1FAIpQLSfO0_ptFl8r8G0UFhT0xhV17eabG-erUWBDiKSRDTqEZ_9ULQ/viewform?entry.1999497328=getInstalledRelatedApps).

estado de la plataforma actual de esta función: https://www.chromestatus.com/feature/5695378309513216

Edición en bugtracker para esta función: https://bugs.chromium.org/p/chromium/issues/detail?id=587623

/Actualización 02/15/2018:

el juicio por getInstalledRelatedApps() se ha completado: https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/completed-trials.md : First available in Chrome M59. Trial ends on January 30, 2018., pero aún no está implementado en Chrome estable: Feature team currently considering the next steps for the feature.

Cuestiones relacionadas