2011-07-04 20 views
5

Estoy buscando una manera de probar si puedo abrir un determinado intento. Sé cómo probar si una acción está disponible como in this example. Sin embargo, eso no es lo suficientemente bueno, ya que una acción como Intent.ACTION_VIEW puede abrir diferentes aplicaciones dependiendo de la uri presentada.Pruebe si la intención está disponible

punto en caso de:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url); 
startActivity(i); 

Esto abrirá una aplicación diferente para diferentes URL, tales como:

url = "ftp://192.168.1.1" 
url = "http://192.168.1.1" 

La url http es bastante seguro: que se abrirá en el navegador web por defecto . La URL del ftp no es así, ya que no es seguro que los usuarios tengan un cliente FTP instalado (en mi caso asumo que AndFTP es un cliente, ya que parece ser uno de los clientes más populares, y no hay una forma estándar de enviar un/pw al cliente, así que esto tiene que ser específico de la aplicación).

Así que ahora me gustaría probar no solo si la acción está disponible (el código vinculado será verdadero si http está disponible pero no ftp), sino también si hay una aplicación que pueda manejar la variedad específica. Las pruebas para la aplicación específica también serían aceptables.

Y, finalmente, esto debe incorporarse en una pieza de código que obtiene uno o más URI para elegir, que debe abrir el primero posible, y devolver un código de error si no se pueden abrir URI. Algo como esto pseudo-código:

success = false; 
for (Uri uri : uris) { 
    if (actionAvailable(uri)) { 
     // set up intent 
     startActivity(intent); 
     success = true; 
     break; 
    } 
} 
return success; 
+1

No entiendo del todo el problema. El filtro de intenciones debería indicar si son compatibles con http o ftp, por lo que creo que el primer método de ejemplo que publicó debería funcionar o no. http://developer.android.com/guide/topics/manifest/data-element.html#scheme – mibollma

+0

El problema es hacer una prueba adecuada para ver si el intento está disponible y se maneja. Tanto ftp como http (y muchos más) son manejados por Intent.ACTION_VIEW. Capturar un error en startActivity no es el camino a seguir. – Wouter

Respuesta

8

Así que ahora me gustaría probar no sólo si la acción está disponible (el código relacionado devolverá verdadero si está disponible, pero http ftp no), sino también si hay una aplicación que puede manejar la variedad específica.

Como @mibollma indica, utilice PackageManager y queryIntentActivities(), suministrándole la Intent que desea utilizar con startActivity(), completa con su URL. Si queryIntentActivities() devuelve una lista vacía, usted sabe que no hay coincidencias para esa Intent. Por ejemplo, si nada tiene un <intent-filter> compatible con el esquema ftp, obtendrá una lista vacía.

para mi caso Asumo AndFTP como cliente, ya que parece ser uno de los clientes más populares, y no hay manera estándar para enviar UN/PW al cliente por lo que este tiene que ser la aplicación específica

Entonces no es compatible con FTP. O incrusta tu propio soporte FTP en lugar de confiar en una aplicación de terceros incompatible, probablemente inexistente.

+0

Para transferencias de archivos, los clientes de ftp suelen ser mucho mejores que un navegador web. Es por eso que quiero ofrecer la opción ftp, recurriendo a http (navegador web incorporado, por lo tanto, garantizado disponible) si no hay disponible un cliente ftp compatible. – Wouter

+0

@Wouter: a continuación, incruste su propio soporte FTP en lugar de confiar en una aplicación de terceros incompatible, probablemente inexistente. – CommonsWare

Cuestiones relacionadas