android.content.ActivityNotFoundException, когда ссылка не содержит http
Мое приложение позволяет пользователям печатать сообщения другим пользователям, используя ограниченный HTML. Одна из вещей, которые я разрешаю - это использование гиперссылок.
Пример:
<a href="www.google.com">Google</a>
Я заселяю TextView
с помощью следующего метода:
txtview.setMovementMethod(LinkMovementMethod.getInstance());
txtview.setText(Html.fromHtml(items.get(position).getBody()));
Если пользователь создает гиперссылку без префикса http
к URL-адресу приложение вылетает со следующим исключением:
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)
Если URL префикс с http
все работает нормально.
Пример:
<a href="http://www.google.com">Google</a>
Как я могу предотвратить это?
1 ответ
Проблема в том, что Html.fromHtml()
создает URLSpan
экземпляры для встроенных URL-адресов, и этот класс "вслепую" вызывает startActivity()
с предоставленным URL. Это происходит сбой всякий раз, когда URL не совпадает ни с одной зарегистрированной активностью.
Проблема хорошо объяснена в этом сообщении CommonsWare. Решение / пример там переопределяет onClick()
и обрабатывает ActivityNotFoundException
чтобы предотвратить аварию.
Если то, что вы хотите сделать, это вместо этого быть более терпимым в отношении ссылки, вы можете переопределить getURL()
вместо этого, например, следующим образом:
@Override
public String getURL()
{
String url = super.getURL();
if (!url.toLowerCase().startsWith("http"))
url = "http://" + url;
return url;
}
Обратите внимание, что это очень грубый пример (например, он не учитывает ссылки "https") - улучшайте по мере необходимости!