Autore Topic: intercettare ActivityNotFoundException  (Letto 1058 volte)

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
intercettare ActivityNotFoundException
« il: 08 Luglio 2011, 20:47:55 CEST »
0
ciao a tutti.

ho una questione che trovo un po' spinosa.

prendiamo queste due righe di codice:
Codice: [Seleziona]
TextView tv = (TextView) v.findViewById(R.id.Data);
tv.setText(Html.fromHtml(content, null, null));

il mio problema è che se content contiene un link html del tipo
<a href="www.prova.it">LINK</a>
quando questo link dentro al TextView viene cliccato scatta un ActivityNotFoundException,
in quanto il link non è preceduto da http:// e quindi Android (giustamente) non sa bene che fare. Notare che il contenuto della variabile content mi arriva da un server che non controllo.

nello specifico la riga di log è questa:
Codice: [Seleziona]
E/AndroidRuntime(  310): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.prova.it (has extras) }
Quindi la domanda: come posso fare ad intercettare questa eccezione e gestirla?

grazie dei suggerimenti!

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:intercettare ActivityNotFoundException
« Risposta #1 il: 10 Luglio 2011, 12:31:14 CEST »
+1
Guarda, catturare l'eccezione mi sembra un workaround, imho, un po' troppo ugly.

Te ne posso suggerire uno, a parer mio, un po' meno brutto?

Codice (Java): [Seleziona]
    public Spanned fixLinkURL (Spanned spantext) {
        Object[] spans = spantext.getSpans(0, spantext.length(), Object.class);
        for (Object span : spans) {
            int start = spantext.getSpanStart(span);
            int end = spantext.getSpanEnd(span);
            int flags = spantext.getSpanFlags(span);
            if (span instanceof URLSpan) {
                URLSpan urlSpan = (URLSpan) span;
                if (urlSpan.getURL().startsWith("www.")) {
                    urlSpan = new URLSpan("http://" + urlSpan.getURL());
                }
                ((Spannable) spantext).removeSpan(span);
                ((Spannable) spantext).setSpan(urlSpan, start, end, flags);
            }
        }
        return spantext;
    }

Codice (Java): [Seleziona]
tv.setText(fixLinkURL(Html.fromHtml("<a href=\"www.prova.it\">LINK</a>")));
Questo dovrebbe risolverti i problemi (solo) con i link che iniziano con "www".
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:intercettare ActivityNotFoundException
« Risposta #2 il: 10 Luglio 2011, 13:14:47 CEST »
0
beh, il fatto che si tratti o no di "ugly workaround" dipende da come viene fatto. Magari esiste un modo 'ufficiale' di intercettare queste eccezioni generate esternamente all'applicazione, e in tal caso non si parlerebbe nemmeno di workaround.

Purtroppo la soluzione che proponi è solo parziale. Al limite potrei aggiungere http:// ogni volta che l'url non lo contiene, così almeno Android lancia il browser (senza far esplodere il mio programma) e, se l'url è scritto in modo balordo, non è più un problema mio.

Comunque è interessante come svolgi l'analisi del testo, grazie.


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:intercettare ActivityNotFoundException
« Risposta #3 il: 10 Luglio 2011, 16:14:24 CEST »
+2
Basta usare le regular expression. Android utilizza le regular expression per individuare in una stringa le URL. Il pattern è definito in "Patterns.WEB_URL". Per individuare un URL e per aggiungere un "http://" se manca bastano queste semplici righe:

Codice: [Seleziona]
String str = "<a href=\"www.prova.it\">LINK</a>";

Matcher mat = Patterns.WEB_URL.matcher(str);
StringBuffer buffer = new StringBuffer(str.length());

while (mat.find()) {
        if (!(mat.group().startsWith("http://")))
                 mat.appendReplacement(buffer, "http://$1");
};
String fix = mat.appendTail(buffer).toString();
adb logcat | tee /tmp/logcat | grep TAG

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:intercettare ActivityNotFoundException
« Risposta #4 il: 11 Luglio 2011, 01:30:58 CEST »
0
Fico.

grazie!