Автолинк не работает на HTC - HtcLinkifyDispatcher

Я использую android:autoLink установлен в web на TextView в моем приложении для Android, чтобы включить интерактивные ссылки. Но если я запускаю это на своем HTC Desire S, обновленном до ICS, при нажатии на одну из ссылок я получаю следующее исключение

android.content.ActivityNotFoundException: Unable to find explicit activity class 
  {com.htc.HtcLinkifyDispatcher/
  com.htc.HtcLinkifyDispatcher.HtcLinkifyDispatcherActivity}; 
  have you declared this activity in your AndroidManifest.xml?

    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1634)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1510)
    at android.app.Activity.startActivityFromChild(Activity.java:3519)
    at android.app.Activity.startActivityForResult(Activity.java:3271)
    at android.app.Activity.startActivity(Activity.java:3358)
    at woodsie.avalanche.info.InfoActivity.startActivity(InfoActivity.java:61)
    at android.text.style.LinkifyURLSpan.onClick(LinkifyURLSpan.java:73)

Попытки зарегистрироваться HtcLinkifyDispatcherActivityпоймите меня никуда, поскольку класс не на моем пути сборки.

1 ответ

Решение

Лучшая статья, которую я нашел, касающаяся этого, была Проблема Linkify: Обнаружение и Смягчение.

Но вместо того, чтобы пытаться перехватить и заменить URLSpan класс, я пошел на уровень ниже и преодолел startActivity() на родительской активности TextView.

@Override
public void startActivity(Intent intent) {
    try {
        /* First attempt at fixing an HTC broken by evil Apple patents. */
        if (intent.getComponent() != null 
                && ".HtcLinkifyDispatcherActivity".equals(intent.getComponent().getShortClassName()))
            intent.setComponent(null);
        super.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        /*
         * Probably an HTC broken by evil Apple patents. This is not perfect,
         * but better than crashing the whole application.
         */
        super.startActivity(Intent.createChooser(intent, null));
    }
}

Хаки, но простой и, кажется, работает.

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