Android.content.ActivityNotFoundException cuando el enlace no contiene http

Mi aplicación permite a los usuarios escribir mensajes a otros usuarios mientras utilizan HTML limitado. Una de las cosas que permiten es el uso de hipervínculos.

Ejemplo:

<a href="www.google.com">Google</a>

Estoy poblando el TextView través del siguiente método:

 txtview.setMovementMethod(LinkMovementMethod.getInstance()); txtview.setText(Html.fromHtml(items.get(position).getBody())); 

Si el usuario crea un hipervínculo sin prefijar http a la url, la aplicación se bloquea con la siguiente excepción:

 FATAL EXCEPTION: main android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.google.com (has extras) } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) 

Si la url es prefijada con http , todo funciona bien.

Ejemplo:

<a href="http://www.google.com">Google</a>

¿Cómo puedo evitar que esto suceda?

El problema es que Html.fromHtml() crea instancias de URLSpan para URL incrustadas, y esta clase "ciegamente" llama a startActivity() con la url suministrada. Esto se bloquea cuando la URL no coincide con ninguna actividad registrada.

El problema está bien explicado en este post de CommonsWare . La solución / ejemplo allí anula onClick() y maneja la ActivityNotFoundException para evitar el bloqueo.

Si lo que quieres hacer es ser más permisivo sobre el enlace en su lugar, puedes reemplazar getURL() lugar de hacerlo, por ejemplo de la siguiente manera:

  @Override public String getURL() { String url = super.getURL(); if (!url.toLowerCase().startsWith("http")) url = "http://" + url; return url; } 

Tenga en cuenta que este es un ejemplo muy crudo (por ejemplo, no tiene en cuenta los enlaces "https") – ¡mejore según sea necesario!

  • Cómo cambiar el estilo de un TextView en tiempo de ejecución
  • Establecer ancho a wrap_content para TextView a través de código
  • Alineación de la línea de base de dos vistas de texto en Android
  • Cree programaticamente TextView con elipsis
  • Tamaño de texto de Android por programa demasiado grande
  • En un Android TextView, ¿es posible insertar párrafos?
  • LineSpacingMultiplier y maxLines cortan la última línea, android textview
  • Configuración de TextView TextAppeareance mediante programación en android
  • Alineación de ImageSpan en TextView
  • Fundido de fondo de un android de vista de texto
  • Actualizar Android TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.