menangani klik tautan textview di aplikasi android saya

148

Saat ini saya sedang merender input HTML dalam TextView seperti:

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

HTML yang ditampilkan disediakan kepada saya melalui sumber daya eksternal, jadi saya tidak dapat mengubah hal-hal di sekitar seperti yang saya mau, tapi saya tentu saja dapat melakukan beberapa perubahan regex dengan HTML, untuk mengubah nilai href, mengatakan, ke sesuatu yang lain.

Yang saya inginkan adalah dapat menangani klik tautan langsung dari dalam aplikasi, daripada membiarkan tautan membuka jendela browser. Apakah ini dapat dicapai? Saya menduga akan mungkin untuk mengatur protokol nilai href ke sesuatu seperti "myApp: //", dan kemudian mendaftarkan sesuatu yang memungkinkan aplikasi saya menangani protokol itu. Jika ini memang cara terbaik, saya ingin tahu bagaimana hal itu dilakukan, tetapi saya berharap ada cara yang lebih mudah untuk hanya mengatakan, "ketika sebuah tautan diklik dalam tampilan teks ini, saya ingin mengangkat acara yang menerima nilai href dari tautan sebagai parameter input "

David Hedlund
sumber
Saya menemukan sesuatu yang lain di [Sini] [1] [1]: stackoverflow.com/questions/7255249/... Semoga itu dapat membantu Anda ^^
Mr_DK
1
David, saya memiliki kasus yang mirip dengan milik Anda, saya mendapatkan html juga dari sumber eksternal (web), tetapi bagaimana cara regex mengubah nilai href sehingga saya dapat menerapkan solusi ini.
X09

Jawaban:

182

Datang pada ini hampir setahun kemudian, ada cara berbeda di mana saya memecahkan masalah khusus saya. Karena saya ingin tautan ditangani oleh aplikasi saya sendiri, ada solusi yang sedikit lebih sederhana.

Selain filter maksud default, saya cukup membiarkan aktivitas target saya mendengarkan ACTION_VIEWmaksud, dan khususnya, mereka yang memiliki skemacom.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>

Ini berarti bahwa tautan yang dimulai dengan com.package.name://akan ditangani oleh aktivitas saya.

Jadi yang harus saya lakukan adalah membuat URL yang berisi informasi yang ingin saya sampaikan:

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

Dalam aktivitas target saya, saya dapat mengambil alamat ini:

Uri data = getIntent().getData();

Dalam contoh saya, saya cukup memeriksa datanilai-nilai nol, karena kapan pun itu bukan nol, saya akan tahu itu dipanggil melalui tautan semacam itu. Dari sana, saya mengekstrak instruksi yang saya butuhkan dari url untuk dapat menampilkan data yang sesuai.

David Hedlund
sumber
1
Hai jawaban Anda sempurna. Bekerja dengan baik. Tapi selanjutnya dapatkah kita mengirim data data yang diteruskan dengan ini?
user861973
4
@ user861973: Ya, getDatamemberi Anda URI lengkap, Anda juga bisa menggunakan getDataStringyang menghasilkan representasi teks. Apa pun itu, Anda bisa membuat URL sehingga memuat semua data yang Anda butuhkan com.package.name://my-action/1/2/3/4, dan Anda bisa mengekstrak informasi dari string itu.
David Hedlund
3
Perlu satu hari bagi saya untuk memahami ide ini, tetapi saya katakan apa - itu sangat berharga. Solusi yang dirancang dengan baik
Dennis
7
solusi hebat Jangan lupa untuk menambahkan ini ke Textview sehingga memungkinkan tautannya. tv.setMovementMethod (LinkMovementMethod.getInstance ());
Daniel Benedykt
3
Maaf, tetapi dalam metode apa dalam kegiatan ini harus saya katakan Uri data = getIntent().getData();? Saya terus menerima Activity not found to handle intentkesalahan. - Terima kasih
rgv
62

Cara lain, meminjam sedikit dari Linkify tetapi memungkinkan Anda untuk menyesuaikan penanganan Anda.

Kelas Rentang Kustom:

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();
    }
}

Fungsi pembantu:

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());
    }
}

Pemakaian:

 clickify(textView, clickText,new ClickSpan.OnClickListener()
     {
        @Override
        public void onClick() {
            // do something
        }
    });
Jonathan S.
sumber
Solusi lain adalah mengganti Rentang dengan Rentang kustom Anda, lihat stackoverflow.com/a/11417498/792677
A-Live
solusi bagus dan elegan
Mario Zderic
Saya menemukan ini menjadi solusi paling sederhana untuk diterapkan. Google tidak pernah membereskan kekacauan ini agar memiliki cara untuk secara konsisten membuat tautan dalam tampilan teks yang dapat diklik. Ini adalah pendekatan brutal untuk memaksakan rentang ke dalamnya, tetapi bekerja dengan baik pada versi OS yang berbeda .. +1
angryITguy
55

jika ada beberapa tautan dalam tampilan teks. Misalnya tampilan teks memiliki "https: //" dan "no tel" kami dapat menyesuaikan metode LinkMovement dan menangani klik untuk kata-kata berdasarkan suatu pola. Terlampir adalah Metode Gerakan Tautan yang dikustomisasi.

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;
}

Ini harus dipanggil dari tampilan teks dengan cara berikut:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
Arun
sumber
8
Anda tidak benar-benar perlu melewati konteks sehingga "di belakang" dalam variabel statis yang terpisah, itu bau. Cukup gunakan widget.getContext()saja.
Sergej Koščejev
Ya konteksnya dapat dihapus. Terima kasih telah menunjukkannya Sergej
Arun
6
Ini berfungsi dengan baik tetapi Anda harus memanggil setMovementMethod setelah setText, jika tidak maka akan ditimpa dengan LinkMovementMethod default
Ray Britton
Berhasil, tetapi tidak perlu mengulangi bentang di setiap klik. Filter menurut posisi juga terlihat rentan terhadap kesalahan. Pendekatan inisialisasi satu kali yang serupa ditunjukkan dalam jawaban ini .
Tuan Smith
@Arun Harap perbarui jawaban Anda sesuai dengan komentar.
Behrouz.
45

Ini adalah solusi yang lebih umum berdasarkan jawaban @Arun

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);
}

Untuk menggunakannya hanya menerapkan onLinkClickdari TextViewLinkHandlerkelas. Misalnya:

    textView.setMovementMethod(new TextViewLinkHandler() {
        @Override
        public void onLinkClick(String url) {
            Toast.makeText(textView.getContext(), url, Toast.LENGTH_SHORT).show();
        }
    });
ruX
sumber
2
bekerja dengan baik. catatan: jangan lupa menambahkan android: autoLink = "web" ke tampilan teks Anda. tanpa atribut tautan otomatis, ini tidak berfungsi.
okarakose
Saya telah mencoba semua solusi yang tercantum di sini. Yang ini adalah yang terbaik untukku. Jelas, mudah digunakan, dan kuat. Petunjuk: Anda harus bekerja dengan Html.fromHtml untuk mendapatkan yang terbaik.
Kai Wang
1
Jawaban Terbaik! Terima kasih! Jangan lupa menambahkan android: autoLink = "web" di xml atau dalam kode LinkifyCompat.addLinks (textView, Linkify.WEB_URLS);
Nikita Axyonov
1
Apa yang akan menjadi persyaratan yang tampaknya sederhana adalah urusan yang cukup kompleks di Android. Solusi ini menghilangkan banyak rasa sakit itu. Telah menemukan bahwa autoLink = "web" tidak diperlukan untuk solusi ini bekerja di Android N .. +1
angryITguy
1
Mengapa di dunia ini kelas seperti ini tidak ada secara asli - setelah bertahun-tahun ini - berada di luar jangkauan saya. Terima kasih Android untuk LinkMovementMethod, tetapi saya biasanya ingin mengontrol UI saya sendiri. Anda dapat melaporkan acara UI kepada saya sehingga pengontrol SAYA dapat menanganinya.
metode tanda lahir
10

sangat sederhana, tambahkan baris ini ke kode Anda:

tv.setMovementMethod(LinkMovementMethod.getInstance());
Jonathan
sumber
1
Terima kasih atas balasan Anda, jonathan. Ya, saya tahu tentang MovementMethod; apa yang saya tidak yakin tentang bagaimana menentukan bahwa aplikasi saya sendiri harus menangani klik tautan, daripada hanya membuka browser, seperti metode gerakan default akan (lihat jawaban yang diterima). Bagaimanapun, terima kasih.
David Hedlund
5

Larutan

Saya telah menerapkan kelas kecil dengan bantuan yang Anda dapat menangani klik panjang pada TextView sendiri dan Taps pada tautan di TextView.

Tata letak

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 "";
        }
    }
}

Pemakaian

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

Tautan

Semoga ini membantu! Anda dapat menemukan kode di sini .

Victor Apoyan
sumber
3

Hanya untuk berbagi solusi alternatif menggunakan perpustakaan yang saya buat. Dengan Textoo , ini bisa dicapai seperti:

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();

Atau dengan sumber HTML dinamis:

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
sumber
Ini harus menjadi jawaban teratas. Terima kasih, Pak, atas kontribusinya
Marian Pavel
3

untuk yang mencari lebih banyak opsi di sini adalah satu

// 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);

SUMBER DAYA: CodePath

Dasser Basyouni
sumber
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
sumber
1

Saya mengubah warna TextView menjadi biru dengan menggunakan misalnya:

android:textColor="#3399FF"

dalam file xml. Cara membuatnya digarisbawahi dijelaskan di sini .

Kemudian gunakan properti onClick untuk menentukan metode (saya kira Anda bisa memanggil setOnClickListener(this)sebagai cara lain), misalnya:

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

Dalam metode itu, saya bisa melakukan apa pun yang saya inginkan seperti biasa, seperti meluncurkan niat. Perhatikan bahwa Anda masih harus melakukan myTextView.setMovementMethod(LinkMovementMethod.getInstance());hal yang normal , seperti pada metode onCreate () aktivitas Anda.

Tyler Collier
sumber
1

Jawaban ini memperluas solusi terbaik Jonathan S:

Anda dapat menggunakan metode berikut untuk mengekstrak tautan dari teks:

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;
    }

Ini dapat digunakan untuk menghapus salah satu parameter dalam clickify()metode:

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());
        }
    }

Beberapa perubahan pada 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);
        }
    }

Sekarang Anda cukup mengatur teks pada TextView dan kemudian menambahkan pendengar ke dalamnya:

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

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

});
WKS
sumber
0

Cara terbaik yang saya gunakan dan selalu berhasil untuk saya

android:autoLink="web"
Rohit Mandiwal
sumber
8
Ini sama sekali tidak menjawab pertanyaan.
Tom
0

Contoh: Misalkan Anda telah menetapkan beberapa teks dalam tampilan teks dan Anda ingin memberikan tautan pada ekspresi teks tertentu: "Klik pada #facebook akan membawa Anda ke facebook.com"

Dalam tata letak xml:

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

Dalam Aktivitas:

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);

Juga buat satu penyedia tag sebagai:

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;
    }

}

Dalam file manifes jadikan sebagai entri untuk penyedia dan aktivitas pengujian sebagai:

<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>

Sekarang ketika Anda mengklik #facebook, itu akan memanggil testactivtiy. Dan dalam aktivitas tes Anda bisa mendapatkan data sebagai:

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