Text Textlink Link klicken in meiner Android App

148

Ich rendere derzeit HTML-Eingaben in einer Textansicht wie folgt:

tv.setText(Html.fromHtml("<a href='test'>test</a>"));

Der angezeigte HTML-Code wird mir über eine externe Ressource zur Verfügung gestellt, sodass ich die Dinge nicht wie gewünscht ändern kann, aber ich kann natürlich einige Regex-Manipulationen am HTML-Code vornehmen, um beispielsweise den href-Wert in etwas anderes zu ändern.

Ich möchte in der Lage sein, einen Link-Klick direkt aus der App heraus zu verarbeiten, anstatt den Link ein Browserfenster öffnen zu lassen. Ist das überhaupt erreichbar? Ich vermute, es wäre möglich, das Protokoll des href-Werts auf "myApp: //" zu setzen und dann etwas zu registrieren, mit dem meine App dieses Protokoll verarbeiten kann. Wenn dies in der Tat der beste Weg ist, würde ich gerne wissen, wie das gemacht wird, aber ich hoffe, es gibt einen einfacheren Weg, einfach zu sagen: "Wenn in dieser Textansicht auf einen Link geklickt wird, möchte ich ein Ereignis auslösen, das empfangen wird der href-Wert des Links als Eingabeparameter "

David Hedlund
quelle
Ich habe unter [Hier] [1] [1] noch etwas anderes gefunden: stackoverflow.com/questions/7255249/… Ich hoffe, das kann dir helfen ^^
Mr_DK
1
David, ich habe einen ähnlichen Fall wie Sie. Ich erhalte das HTML auch von einer externen Quelle (Web), aber wie kann ich den href-Wert durch Regex manipulieren, damit ich diese Lösung anwenden kann?
X09

Antworten:

182

Fast ein Jahr später habe ich mein spezielles Problem auf andere Weise gelöst. Da ich wollte, dass der Link von meiner eigenen App verwaltet wird, gibt es eine Lösung, die etwas einfacher ist.

Neben dem Standard-Absichtsfilter lasse ich meine ACTION_VIEWZielaktivität einfach die Absichten abhören , insbesondere die mit dem Schemacom.package.name

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="com.package.name" />  
</intent-filter>

Dies bedeutet, dass Links, die mit beginnen com.package.name://, von meiner Aktivität behandelt werden.

Ich muss also nur eine URL erstellen, die die Informationen enthält, die ich übermitteln möchte:

com.package.name://action-to-perform/id-that-might-be-needed/

In meiner Zielaktivität kann ich diese Adresse abrufen:

Uri data = getIntent().getData();

In meinem Beispiel könnte ich einfach datanach Nullwerten suchen, denn wenn es nicht Null ist, weiß ich, dass es über einen solchen Link aufgerufen wurde. Von dort extrahiere ich die Anweisungen, die ich benötige, aus der URL, um die entsprechenden Daten anzeigen zu können.

David Hedlund
quelle
1
Hey, deine Antwort ist perfekt. Funktioniert gut. Aber können wir damit weiterhin Daten von übergebenen Daten senden?
user861973
4
@ user861973: Ja, getDatagibt Ihnen den vollständigen URI, den Sie auch verwenden können getDataString, um eine Textdarstellung zu erhalten. In beiden Fällen können Sie die URL so erstellen, dass sie alle benötigten Daten enthält com.package.name://my-action/1/2/3/4, und Sie können die Informationen aus dieser Zeichenfolge extrahieren.
David Hedlund
3
Ich habe einen Tag gebraucht, um diese Idee zu verstehen, aber ich sage Ihnen was - das hat sich gelohnt. Gut gestaltete Lösung
Dennis
7
tolle Lösung. Vergessen Sie nicht, dies zur Textansicht hinzuzufügen, damit die Links aktiviert werden. tv.setMovementMethod (LinkMovementMethod.getInstance ());
Daniel Benedykt
3
Entschuldigung, aber in welcher Methode in der Aktivität soll ich sagen Uri data = getIntent().getData();? Ich erhalte immer wieder Activity not found to handle intentFehler. - Danke
rgv
62

Eine andere Möglichkeit ist das Ausleihen von Linkify, aber Sie können Ihre Handhabung anpassen.

Benutzerdefinierte Spannenklasse:

public class ClickSpan extends ClickableSpan {

    private OnClickListener mListener;

    public ClickSpan(OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View widget) {
       if (mListener != null) mListener.onClick();
    }

    public interface OnClickListener {
        void onClick();
    }
}

Hilfsfunktion:

public static void clickify(TextView view, final String clickableText, 
    final ClickSpan.OnClickListener listener) {

    CharSequence text = view.getText();
    String string = text.toString();
    ClickSpan span = new ClickSpan(listener);

    int start = string.indexOf(clickableText);
    int end = start + clickableText.length();
    if (start == -1) return;

    if (text instanceof Spannable) {
        ((Spannable)text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else {
        SpannableString s = SpannableString.valueOf(text);
        s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        view.setText(s);
    }

    MovementMethod m = view.getMovementMethod();
    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        view.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

Verwendung:

 clickify(textView, clickText,new ClickSpan.OnClickListener()
     {
        @Override
        public void onClick() {
            // do something
        }
    });
Jonathan S.
quelle
Eine andere Lösung besteht darin, die Spans durch Ihre benutzerdefinierten Spans zu ersetzen. Siehe stackoverflow.com/a/11417498/792677
A-Live
große elegante Lösung
Mario Zderic
Ich fand, dass dies die einfachste zu implementierende Lösung ist. Google hat dieses Durcheinander nie aufgeräumt, um Links in Textansichten konsistent anklickbar zu machen. Es ist ein brutaler Ansatz, um eine Zeitspanne zu erzwingen, aber es funktioniert gut auf verschiedenen Betriebssystemversionen. +1
AngryITguy
55

wenn die Textansicht mehrere Links enthält. Zum Beispiel hat die Textansicht "https: //" und "tel no". Wir können die LinkMovement-Methode anpassen und Klicks für Wörter basierend auf einem Muster verarbeiten. Anbei die angepasste Link-Bewegungsmethode.

public class CustomLinkMovementMethod extends LinkMovementMethod
{

private static Context movementContext;

private static CustomLinkMovementMethod linkMovementMethod = new CustomLinkMovementMethod();

public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event)
{
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP)
    {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length != 0)
        {
            String url = link[0].getURL();
            if (url.startsWith("https"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Link was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("tel"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Tel was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("mailto"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Mail link was clicked", Toast.LENGTH_LONG).show();
            }
            return true;
        }
    }

    return super.onTouchEvent(widget, buffer, event);
}

public static android.text.method.MovementMethod getInstance(Context c)
{
    movementContext = c;
    return linkMovementMethod;
}

Dies sollte in der Textansicht folgendermaßen aufgerufen werden:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
Arun
quelle
8
Sie müssen den Kontext nicht wirklich "hinter dem Rücken" in einer separaten statischen Variablen übergeben, das stinkt irgendwie. Verwenden Sie widget.getContext()stattdessen einfach .
Sergej Koščejev
Ja, der Kontext kann entfernt werden. Vielen Dank für den Hinweis Sergej
Arun
6
Dies funktioniert hervorragend, aber Sie müssen setMovementMethod nach setText aufrufen, da es sonst mit der Standard-LinkMovementMethod
Ray Britton
Funktioniert, aber es ist nicht erforderlich, bei jedem Klick über die Bereiche zu iterieren. Auch der Filter nach Position ist fehleranfällig. Ein ähnlicher Ansatz für die einmalige Initialisierung wird in dieser Antwort gezeigt .
Mister Smith
@Arun Bitte aktualisieren Sie Ihre Antwort gemäß den Kommentaren.
Behrouz.M
45

Hier ist eine allgemeinere Lösung, die auf der Antwort von @Arun basiert

public abstract class TextViewLinkHandler extends LinkMovementMethod {

    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        if (event.getAction() != MotionEvent.ACTION_UP)
            return super.onTouchEvent(widget, buffer, event);

        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length != 0) {
            onLinkClick(link[0].getURL());
        }
        return true;
    }

    abstract public void onLinkClick(String url);
}

Um es einfach zu verwenden , implementieren onLinkClickder TextViewLinkHandlerKlasse. Zum Beispiel:

    textView.setMovementMethod(new TextViewLinkHandler() {
        @Override
        public void onLinkClick(String url) {
            Toast.makeText(textView.getContext(), url, Toast.LENGTH_SHORT).show();
        }
    });
ruX
quelle
2
funktioniert super. Hinweis: Vergessen Sie nicht, Ihrer Textansicht android: autoLink = "web" hinzuzufügen. Ohne Autolink-Attribut funktioniert dies nicht.
Okarakose
Ich habe alle hier aufgeführten Lösungen ausprobiert. Dieser ist der beste für mich. Es ist klar, einfach zu bedienen und leistungsstark. Hinweis: Sie müssen mit Html.fromHtml arbeiten, um das Beste daraus zu machen.
Kai Wang
1
Beste Antwort! Vielen Dank! Vergessen Sie nicht, Android hinzuzufügen: autoLink = "web" in XML oder im Code LinkifyCompat.addLinks (textView, Linkify.WEB_URLS);
Nikita Axyonov
1
Was eine scheinbar einfache Anforderung wäre, ist eine ziemlich komplexe Angelegenheit in Android. Diese Lösung nimmt viel von diesem Schmerz weg. Habe festgestellt, dass autoLink = "web" nicht erforderlich ist, damit diese Lösung unter Android N funktioniert. +1
AngryITguy
1
Warum in aller Welt eine solche Klasse nach all den Jahren nicht nativ existiert, ist mir ein Rätsel. Vielen Dank an Android für LinkMovementMethod, aber normalerweise möchte ich die Kontrolle über meine eigene Benutzeroberfläche haben. Sie können UI-Ereignisse an mich melden, damit MEIN Controller sie verarbeiten kann.
Methodensignatur
10

Es ist sehr einfach, diese Zeile zu Ihrem Code hinzuzufügen:

tv.setMovementMethod(LinkMovementMethod.getInstance());
Jonathan
quelle
1
Danke für deine Antwort, Jonathan. Ja, ich wusste über MovementMethod Bescheid. Ich war mir nicht sicher, wie ich festlegen sollte, dass meine eigene App den Linkklick verarbeiten soll, anstatt nur einen Browser zu öffnen, wie dies bei der Standardbewegungsmethode der Fall wäre (siehe die akzeptierte Antwort). Danke trotzdem.
David Hedlund
5

Lösung

Ich habe eine kleine Klasse implementiert, mit deren Hilfe Sie lange Klicks auf TextView selbst und Tippen auf die Links in TextView verarbeiten können.

Layout

TextView android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="all"/>

TextViewClickMovement.java

import android.content.Context;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Patterns;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;

public class TextViewClickMovement extends LinkMovementMethod {

    private final String TAG = TextViewClickMovement.class.getSimpleName();

    private final OnTextViewClickMovementListener mListener;
    private final GestureDetector                 mGestureDetector;
    private TextView                              mWidget;
    private Spannable                             mBuffer;

    public enum LinkType {

        /** Indicates that phone link was clicked */
        PHONE,

        /** Identifies that URL was clicked */
        WEB_URL,

        /** Identifies that Email Address was clicked */
        EMAIL_ADDRESS,

        /** Indicates that none of above mentioned were clicked */
        NONE
    }

    /**
     * Interface used to handle Long clicks on the {@link TextView} and taps
     * on the phone, web, mail links inside of {@link TextView}.
     */
    public interface OnTextViewClickMovementListener {

        /**
         * This method will be invoked when user press and hold
         * finger on the {@link TextView}
         *
         * @param linkText Text which contains link on which user presses.
         * @param linkType Type of the link can be one of {@link LinkType} enumeration
         */
        void onLinkClicked(final String linkText, final LinkType linkType);

        /**
         *
         * @param text Whole text of {@link TextView}
         */
        void onLongClick(final String text);
    }


    public TextViewClickMovement(final OnTextViewClickMovementListener listener, final Context context) {
        mListener        = listener;
        mGestureDetector = new GestureDetector(context, new SimpleOnGestureListener());
    }

    @Override
    public boolean onTouchEvent(final TextView widget, final Spannable buffer, final MotionEvent event) {

        mWidget = widget;
        mBuffer = buffer;
        mGestureDetector.onTouchEvent(event);

        return false;
    }

    /**
     * Detects various gestures and events.
     * Notify users when a particular motion event has occurred.
     */
    class SimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onDown(MotionEvent event) {
            // Notified when a tap occurs.
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            // Notified when a long press occurs.
            final String text = mBuffer.toString();

            if (mListener != null) {
                Log.d(TAG, "----> Long Click Occurs on TextView with ID: " + mWidget.getId() + "\n" +
                                  "Text: " + text + "\n<----");

                mListener.onLongClick(text);
            }
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent event) {
            // Notified when tap occurs.
            final String linkText = getLinkText(mWidget, mBuffer, event);

            LinkType linkType = LinkType.NONE;

            if (Patterns.PHONE.matcher(linkText).matches()) {
                linkType = LinkType.PHONE;
            }
            else if (Patterns.WEB_URL.matcher(linkText).matches()) {
                linkType = LinkType.WEB_URL;
            }
            else if (Patterns.EMAIL_ADDRESS.matcher(linkText).matches()) {
                linkType = LinkType.EMAIL_ADDRESS;
            }

            if (mListener != null) {
                Log.d(TAG, "----> Tap Occurs on TextView with ID: " + mWidget.getId() + "\n" +
                                  "Link Text: " + linkText + "\n" +
                                  "Link Type: " + linkType + "\n<----");

                mListener.onLinkClicked(linkText, linkType);
            }

            return false;
        }

        private String getLinkText(final TextView widget, final Spannable buffer, final MotionEvent event) {

            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                return buffer.subSequence(buffer.getSpanStart(link[0]),
                        buffer.getSpanEnd(link[0])).toString();
            }

            return "";
        }
    }
}

Verwendung

TextView tv = (TextView) v.findViewById(R.id.textview);
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
textView.setMovementMethod(new TextViewClickMovement(this, context));

Links

Hoffe das hilft! Code finden Sie hier .

Victor Apoyan
quelle
3

Nur um eine alternative Lösung mit einer von mir erstellten Bibliothek zu teilen. Mit Textoo kann dies wie folgt erreicht werden:

TextView locNotFound = Textoo
    .config((TextView) findViewById(R.id.view_location_disabled))
    .addLinksHandler(new LinksHandler() {
        @Override
        public boolean onClick(View view, String url) {
            if ("internal://settings/location".equals(url)) {
                Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(locSettings);
                return true;
            } else {
                return false;
            }
        }
    })
    .apply();

Oder mit dynamischer HTML-Quelle:

String htmlSource = "Links: <a href='http://www.google.com'>Google</a>";
Spanned linksLoggingText = Textoo
    .config(htmlSource)
    .parseHtml()
    .addLinksHandler(new LinksHandler() {
        @Override
        public boolean onClick(View view, String url) {
            Log.i("MyActivity", "Linking to google...");
            return false; // event not handled.  Continue default processing i.e. link to google
        }
    })
    .apply();
textView.setText(linksLoggingText);
PH88
quelle
Dies sollte die beste Antwort sein. Vielen Dank, Sir, für den Beitrag
Marian Pavel
3

denn wer hier nach mehr Möglichkeiten sucht, ist einer

// Set text within a `TextView`
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Hey @sarah, where did @jim go? #lost");
// Style clickable spans based on pattern
new PatternEditableBuilder().
    addPattern(Pattern.compile("\\@(\\w+)"), Color.BLUE,
       new PatternEditableBuilder.SpannableClickedListener() {
        @Override
        public void onSpanClicked(String text) {
            Toast.makeText(MainActivity.this, "Clicked username: " + text,
                Toast.LENGTH_SHORT).show();
        }
}).into(textView);

RESSOURCE: CodePath

Dasser Basyouni
quelle
2
public static void setTextViewFromHtmlWithLinkClickable(TextView textView, String text) {
    Spanned result;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
    } else {
        result = Html.fromHtml(text);
    }
    textView.setText(result);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}
Kai Wang
quelle
1

Ich habe die Farbe der Textansicht in Blau geändert, indem ich zum Beispiel Folgendes verwendet habe:

android:textColor="#3399FF"

in der XML-Datei. Wie es unterstrichen wird, wird hier erklärt .

Verwenden Sie dann die onClick-Eigenschaft, um eine Methode anzugeben (ich vermute, Sie könnten sie setOnClickListener(this)auch auf andere Weise aufrufen ), z.

myTextView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
    doSomething();
}
});

Auf diese Weise kann ich wie gewohnt tun, was ich will, z. B. eine Absicht starten. Beachten Sie, dass Sie immer noch das Normale myTextView.setMovementMethod(LinkMovementMethod.getInstance());tun müssen, wie in der onCreate () -Methode Ihrer Aktivität.

Tyler Collier
quelle
1

Diese Antwort erweitert die hervorragende Lösung von Jonathan S:

Mit der folgenden Methode können Sie Links aus dem Text extrahieren:

private static ArrayList<String> getLinksFromText(String text) {
        ArrayList links = new ArrayList();

        String regex = "\(?\b((http|https)://www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(text);
        while (m.find()) {
            String urlStr = m.group();
            if (urlStr.startsWith("(") && urlStr.endsWith(")")) {
                urlStr = urlStr.substring(1, urlStr.length() - 1);
            }
            links.add(urlStr);
        }
        return links;
    }

Dies kann verwendet werden, um einen der Parameter in der clickify()Methode zu entfernen :

public static void clickify(TextView view,
                                final ClickSpan.OnClickListener listener) {

        CharSequence text = view.getText();
        String string = text.toString();


        ArrayList<String> linksInText = getLinksFromText(string);
        if (linksInText.isEmpty()){
            return;
        }


        String clickableText = linksInText.get(0);
        ClickSpan span = new ClickSpan(listener,clickableText);

        int start = string.indexOf(clickableText);
        int end = start + clickableText.length();
        if (start == -1) return;

        if (text instanceof Spannable) {
            ((Spannable) text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            SpannableString s = SpannableString.valueOf(text);
            s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            view.setText(s);
        }

        MovementMethod m = view.getMovementMethod();
        if ((m == null) || !(m instanceof LinkMovementMethod)) {
            view.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }

Einige Änderungen am ClickSpan:

public static class ClickSpan extends ClickableSpan {

        private String mClickableText;
        private OnClickListener mListener;

        public ClickSpan(OnClickListener listener, String clickableText) {
            mListener = listener;
            mClickableText = clickableText;
        }

        @Override
        public void onClick(View widget) {
            if (mListener != null) mListener.onClick(mClickableText);
        }

        public interface OnClickListener {
            void onClick(String clickableText);
        }
    }

Jetzt können Sie einfach den Text in der Textansicht festlegen und einen Listener hinzufügen:

TextViewUtils.clickify(textWithLink,new TextUtils.ClickSpan.OnClickListener(){

@Override
public void onClick(String clickableText){
  //action...
}

});
WKS
quelle
0

Die beste Art, die ich benutzt habe und es hat immer bei mir funktioniert

android:autoLink="web"
Rohit Mandiwal
quelle
8
Dies beantwortet die Frage überhaupt nicht.
Tom
0

Beispiel: Angenommen, Sie haben Text in der Textansicht festgelegt und möchten einen Link zu einem bestimmten Textausdruck bereitstellen: "Klicken Sie auf #facebook , um zu facebook.com zu gelangen."

Im Layout xml:

<TextView
            android:id="@+id/testtext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

In Aktivität:

String text  =  "Click on #facebook will take you to facebook.com";
tv.setText(text);
Pattern tagMatcher = Pattern.compile("[#]+[A-Za-z0-9-_]+\\b");
String newActivityURL = "content://ankit.testactivity/";
Linkify.addLinks(tv, tagMatcher, newActivityURL);

Erstellen Sie außerdem einen Tag-Anbieter als:

public class TagProvider extends ContentProvider {

    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri arg0) {
        return "vnd.android.cursor.item/vnd.cc.tag";
    }

    @Override
    public Uri insert(Uri arg0, ContentValues arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
                        String arg4) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        return 0;
    }

}

In der Manifestdatei als Eintrag für Anbieter- und Testaktivität wie folgt eingeben:

<provider
    android:name="ankit.TagProvider"
    android:authorities="ankit.testactivity" />

<activity android:name=".TestActivity"
    android:label = "@string/app_name">
    <intent-filter >
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/vnd.cc.tag" />
    </intent-filter>
</activity>

Wenn Sie nun auf #facebook klicken, wird testactivtiy aufgerufen. In der Testaktivität können Sie die Daten wie folgt abrufen:

Uri uri = getIntent().getData();
Ankit Adlakha
quelle