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") - улучшайте по мере необходимости!

Другие вопросы по тегам